4

我有一个简单的 Swing GUI。(不仅如此,我写的所有摇摆GUI)。运行它时,除了空白屏幕,它什么都不显示,直到我调整主框架的大小,所以每个组件都重新绘制,我可以显示它们。

这是我的简单代码:

public static void main(String[] args) {
        JFrame frame = new JFrame("JScroll Pane Test");
        frame.setVisible(true);
        frame.setSize(new Dimension(800, 600));

        JTextArea txtNotes = new JTextArea();
        txtNotes.setText("Hello World");
        JScrollPane scrollPane = new JScrollPane(txtNotes);
        frame.add(scrollPane);
}

所以,我的问题是:当我开始这个课程时,框架会出现我添加的所有组件,直到我调整框架大小。

谢谢 :)

4

2 回答 2

13
  • 不要在可见 ( )JFrame之后添加组件JFramesetVisible(true)

  • setSize()调用框架而不是调用pack()(导致JFrame调整大小以适应其子组件的首选大小和布局)并让LayoutManager处理大小并不是一个很好的做法。

  • 使用EDT(事件调度线程)

  • 像@Gilbert Le Blanc所说的那样打电话JFrame#setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)(给他+1),否则你的EDT/Initial线程即使在关闭JFrame后也将保持活动状态

像这样:

public static void main(String[] args) {
        //Create GUI on EDT Thread
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {

                  JFrame frame = new JFrame("JScroll Pane Test");
                  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  

                  JTextArea txtNotes = new JTextArea();
                  txtNotes.setText("Hello World");
                  JScrollPane scrollPane = new JScrollPane(txtNotes);
                  frame.add(scrollPane);//add components

                  frame.pack();
                  frame.setVisible(true);//show (after adding components)
            }
        });
}
于 2012-10-03T17:21:36.643 回答
5

您的简单代码缺少一些东西。

您必须调用SwingUtilities以将 Swing 组件放在事件分派线程上。

你应该setDefaultCloseOperationJFrame.

您必须以JFrame正确的顺序调用这些方法。setSizeorpack方法被调用,然后该方法setVisible被最后调用。

public class SimpleFrame implements Runnable {

    @Override
    public void run() {
        JFrame frame = new JFrame("JScroll Pane Test");

        JTextArea txtNotes = new JTextArea();
        txtNotes.setText("Hello World");
        JScrollPane scrollPane = new JScrollPane(txtNotes);
        frame.add(scrollPane);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    
        frame.setSize(new Dimension(800, 600));
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new SimpleFrame());
    }

}
于 2012-10-03T17:26:46.690 回答