1

我正在尝试学习 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 之间的差异,而是关于我在两个编译器中遇到的问题/发生 - 有时结果是想要的,有时不是。为什么会这样?

提前致谢!

4

2 回答 2

3

将您setVisible( true )移到添加所有组件的时刻。

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

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

于 2013-04-12T10:21:49.407 回答
3

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

所以只需移动这条线:

setVisible(true);

到构造函数的末尾。

再提几点意见:

  • 不需要就不要扩展(这里不需要)
  • 确保所有与 UI 相关的操作都在 EDT 上完成(使用SwingUtilities.invokeLater()块启动 UI)
  • 不要打电话setSize(screenSize.width, screenSize.height);,而是frame.setExtendedState(Frame.MAXIMIZED_BOTH);让一个窗口占据整个屏幕空间。还考虑pack()在使框架可见之前(但在调用之前frame.setExtendedState(Frame.MAXIMIZED_BOTH);)调用,以便正确布置所有组件,这也将框架的大小设置为其计算的首选大小。
于 2013-04-12T10:22:02.217 回答