JButtons没有出现在我的JFrame上

时间:2014-01-10 18:28:12

标签: java swing layout jframe layout-manager

我正在制作一个包含GUI的程序。由于某些原因,我运行程序时,我创建的JButton个对象没有显示在我的JFrame上。这是代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class ReverseAStringMain extends JPanel {
private JButton enterButton, exitButton;
private JTextField textField;
private JPanel buttonPanel;
private JTextArea textArea;


public ReverseAStringMain(){
    JButton enterButton = new JButton("Enter");
    JButton exitButton = new JButton("Exit");
    enterButton.setPreferredSize(new Dimension(60,60));
    exitButton.setPreferredSize(new Dimension(60,60));

    ButtonListener listener = new ButtonListener();
    enterButton.addActionListener(listener);
    exitButton.addActionListener(listener);

    buttonPanel = new JPanel();
    buttonPanel.setPreferredSize(new Dimension(200,50));
    buttonPanel.setBackground(Color.black);
    buttonPanel.add(enterButton);
    buttonPanel.add(exitButton);


    textField = new JTextField();
    textField.setSize(200, 100);

    textArea = new JTextArea();
    textArea.add(textField);


    add(buttonPanel);
    add(textField);

}

//Creating a ButtonListener class that implements the ActionListener interface
private class ButtonListener implements ActionListener{
        @Override
        //Overriding the ActionPerformed method of ActionListener
        public void actionPerformed(ActionEvent action) {
            if(action.getSource()== enterButton)
                enterButton();
            if(action.getSource()== exitButton)
                System.exit(0);
        }
}       

private void enterButton() {
            // TODO Auto-generated method stub

}


public static void main (String[] args){
    JFrame frame = new JFrame("Raj's Reverse a String Program");
    frame.setBackground(Color.white);
    frame.setVisible(true);
    frame.setResizable(false);
    frame.setLocationRelativeTo(null);
    frame.setSize(new Dimension(600,600));
    //frame.pack();
    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(new ReverseAStringMain());



}

}

如果我的代码中有任何问题或改进,请告诉我们!

4 个答案:

答案 0 :(得分:4)

您可以在JFrame可见后添加组件。您应该在它可见之前将它们添加到JFrame,或者在添加组件后重新验证JFrame。

答案 1 :(得分:3)

当我加载你的代码时(在使它的高度变得更短之后),这就是我所看到的:

Preferred Size

我怀疑这更符合您期望所看到的内容。

Laid Out

我是这样做的。仔细看看:

  • 提供给BorderLayout构造函数的数字,用于面板之间的空白区域。
  • 控件周围的空白EmptyBorder
  • 使用pack()将GUI缩小到自然大小。
  • 在构建文本字段和文本区域时使用大小提示。
  • 使用第二种布局 - 通常称为组合或嵌套布局。

import java.awt.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class ReverseAStringMain extends JPanel {
private JButton enterButton, exitButton;
private JTextField textField;
private JPanel pageTopPanel;
private JTextArea textArea;

public ReverseAStringMain(){
    super(new BorderLayout(10,10));
    setBorder(new EmptyBorder(5,15,5,15));
    JButton enterButton = new JButton("Enter");
    JButton exitButton = new JButton("Exit");

    pageTopPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
    pageTopPanel.setBackground(Color.black);
    pageTopPanel.add(enterButton);
    pageTopPanel.add(exitButton);
    textField = new JTextField(5);
    pageTopPanel.add(textField);

    textArea = new JTextArea(4,40);
    add(pageTopPanel, BorderLayout.PAGE_START);
    add(textArea);  // defaults to CENTER
}

public static void main (String[] args){
    Runnable r = new Runnable() {
        public void run() {
            JFrame frame = new JFrame("XXX's Laid out Program");
            frame.setBackground(Color.white);
            frame.setResizable(false);
            frame.setLocationRelativeTo(null);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().add(new ReverseAStringMain());

            frame.pack();
            frame.setVisible(true);
        }
    };
    SwingUtilities.invokeLater(r);
}
}

一般提示

Java GUI可能必须在许多平台上工作,在不同的屏幕分辨率和使用不同的PLAF。因此,它们不利于组件的精确放置。要组织强大的GUI组件,而是使用布局管理器,或combinations of them 1 ,以及布局填充和& white space 2 的边框。

答案 2 :(得分:2)

通常,您希望将框架设置为 After 添加组件

JFrame frame = new JFrame("Raj's Reverse a String Program");
frame.setBackground(Color.white);
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.setSize(new Dimension(600,600));
//frame.pack();
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new ReverseAStringMain());
frame.setVisible(true);                                   <<------

此外,使用.pack() .setSize()的{​​{1}} insteack 更好的做法,所以你在评论//.pack()

中正确使用了它

如果您想为面板设置尺寸,您可以覆盖getPreferredSize()这样的

public Dimension getPreferredSize() {
    return new Dimension(300, 300);   // or whatever size you want
}

当您.pack()时,框架会尊重此首选尺寸。


另外,不是,设置JTextField的大小将不起作用。你想要做的是传递一个字符空格数的整数值,比如这个

textField = new JTextField(20);

查看所有上述要点的程序的编辑版本。我也做过的一件事就是摆脱你所有的.setPreferredSize。你会看到差异

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class ReverseAStringMain extends JPanel {
    private JButton enterButton, exitButton;
    private JTextField textField;
    private JPanel buttonPanel;
    private JTextArea textArea;

    public ReverseAStringMain() {
        JButton enterButton = new JButton("Enter");
        JButton exitButton = new JButton("Exit");
        //enterButton.setPreferredSize(new Dimension(60, 60));
        //exitButton.setPreferredSize(new Dimension(60, 60));

        ButtonListener listener = new ButtonListener();
        enterButton.addActionListener(listener);
        exitButton.addActionListener(listener);

        buttonPanel = new JPanel();
        //buttonPanel.setPreferredSize(new Dimension(200, 50));
        buttonPanel.setBackground(Color.black);
        buttonPanel.add(enterButton);
        buttonPanel.add(exitButton);

        textField = new JTextField(20);
        //textField.setSize(200, 100);     /// <<-----------

        textArea = new JTextArea();
        textArea.add(textField);

        add(buttonPanel);
        add(textField);

    }

    public Dimension getPreferredSize() {
        return new Dimension(600, 600);
    }

    // Creating a ButtonListener class that implements the ActionListener
    // interface
    private class ButtonListener implements ActionListener {
        @Override
        // Overriding the ActionPerformed method of ActionListener
        public void actionPerformed(ActionEvent action) {
            if (action.getSource() == enterButton)
                enterButton();
            if (action.getSource() == exitButton)
                System.exit(0);
        }
    }

    private void enterButton() {
        // TODO Auto-generated method stub

    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("Raj's Reverse a String Program");
        frame.setBackground(Color.white);
        frame.getContentPane().add(new ReverseAStringMain());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

有关使用Swing创建GUI的更多信息,请查看Swing tutorial trail

答案 3 :(得分:0)

尝试将buttonPanel添加到Container,就像这样。而是扩展JFrame

 Container contentpane = getContentPane();

 contentPane.add(buttonPanel);