关于Swing组件的代码澄清

时间:2016-02-03 14:21:42

标签: java swing jframe

我通过将我的类扩展到JFrame来制作JFrame。在我的构造函数中,我有这个代码

public MyUI() {
    this.setSize(400, 400);
    this.setVisible(true);
    this.setLocationRelativeTo(null);
    this.setResizable(false);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setTitle("Calculator");


    JTextField textField1 = new JTextField("test", 15);
    JPanel thePanel = new JPanel();
    JLabel label1 = new JLabel("Tell me something");
    JButton button1 = new JButton("Click Me");

    button1.setToolTipText("Bla");
    thePanel.add(label1);
    thePanel.add(button1);
    thePanel.add(textField1);

    this.add(thePanel);
}

然而,没有任何表现。但如果我注释掉

JTextField textField1 = new JTextField("test", 15);
thePanel.add(textField1);

一切正常。我的代码有什么问题?

2 个答案:

答案 0 :(得分:2)

问题是您在将组件添加到框架之前将框架设置为可见,这会导致组件层次结构无效。来自the docs for the add method

  

如果已经显示了容器,则必须在此后验证层次结构才能显示添加的组件。

要更正此问题,您应在添加this.setVisible(true)后将行thePanel移至最后。或者,您也可以在结尾处拨打revalidaterepaint,以强制更新和重新绘制。

至于为什么它在你注释掉那条线时起作用,我不知道,但你不能依赖它。在我的机器上,即使删除了这些行,它也不会显示任何组件。

答案 1 :(得分:2)

问题是您在添加组件之前显示JFramesetVisible(true)),

所以:

仅在添加所有组件后调用setVisible(true)

或致电:

revalidate();
repaint();

告诉JFrame重新计算其布局,并重新绘制自己。

我不知道,为什么评论文本字段部分,使JFrame显示正确,也许它与组件布局有关。