相同的Java源导致各种结果

时间:2013-04-12 10:19:15

标签: java swing user-interface jframe

我正在尝试学习Java并希望编写GUI。尝试从简单的计算器开始,我在尝试使用JTextField时遇到了问题。编译以下代码有时会导致一个空框架,有时会在其中包含面板和按钮。

无论我使用javac还是eclipse,都会发生这种情况。 我使用以下代码:

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



public class Mainframe extends JFrame {

private JButton button1;
private JPanel mainpanel;
private JLabel headline;
private Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
JTextField number1;
JTextField number2;


public Mainframe(String s) {

    super(s);
    setSize(screenSize.width, screenSize.height);
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    mainpanel = new JPanel(new BorderLayout(100, 100));
    number1 = new JTextField(20);
    number2 = new JTextField(20);
    headline = new JLabel("Simple Calculator");
    button1 = new JButton("1");

    mainpanel.add(headline, BorderLayout.NORTH);
    mainpanel.add(number1, BorderLayout.SOUTH);
    mainpanel.add(button1, BorderLayout.EAST);
    mainpanel.add(number2, BorderLayout.CENTER);
    mainpanel.validate();

    getContentPane().add(mainpanel);

}

public static void main(String[] args) {
    Mainframe mainframe1 = new Mainframe("Title");

}
}

我想重复一遍:这不是关于javac和eclipse之间的差异,而是关于我对两个编译器的问题/出现 - 有时结果是想要的,有时不是。为什么会这样?

提前致谢!

2 个答案:

答案 0 :(得分:3)

setVisible( true )移至已添加所有组件的位置。

如果您不这样做,则需要重新验证布局,如Container#add方法的javadoc所示:

  

此方法更改与布局相关的信息,因此使组件层次结构无效。如果已显示容器,则必须在此后验证层次结构,以显示添加的组件。

答案 1 :(得分:3)

确保对JFrame.setVisible(true)的调用是您调用的最后一行。

所以只需移动一行:

setVisible(true);

到构造函数的结尾。

还有一些评论:

  • 如果不需要,请不要延长(此处不需要)
  • 确保所有与UI相关的操作都在EDT上完成(使用SwingUtilities.invokeLater()块启动您的用户界面)
  • 请勿调用setSize(screenSize.width, screenSize.height);,而是frame.setExtendedState(Frame.MAXIMIZED_BOTH);来创建一个窗口占据整个屏幕空间。考虑在使框架可见之前(但在调用pack()之前)调用frame.setExtendedState(Frame.MAXIMIZED_BOTH);,以便正确布局所有组件,并且还将框架的大小设置为其计算的首选大小。