我正在尝试学习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之间的差异,而是关于我对两个编译器的问题/出现 - 有时结果是想要的,有时不是。为什么会这样?
提前致谢!
答案 0 :(得分:3)
将setVisible( true )
移至已添加所有组件的位置。
如果您不这样做,则需要重新验证布局,如Container#add
方法的javadoc所示:
此方法更改与布局相关的信息,因此使组件层次结构无效。如果已显示容器,则必须在此后验证层次结构,以显示添加的组件。
答案 1 :(得分:3)
确保对JFrame.setVisible(true)
的调用是您调用的最后一行。
所以只需移动一行:
setVisible(true);
到构造函数的结尾。
还有一些评论:
SwingUtilities.invokeLater()
块启动您的用户界面)setSize(screenSize.width, screenSize.height);
,而是frame.setExtendedState(Frame.MAXIMIZED_BOTH);
来创建一个窗口占据整个屏幕空间。考虑在使框架可见之前(但在调用pack()
之前)调用frame.setExtendedState(Frame.MAXIMIZED_BOTH);
,以便正确布局所有组件,并且还将框架的大小设置为其计算的首选大小。