Java Swing:为什么必须调整框架大小,以便显示组件已添加

hqt*_*hqt 4 java layout swing jframe jscrollpane

我有一个简单的Swing GUI.(而且不仅如此,我编写的所有swing 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);
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢 :)

Dav*_*amp 13

  • JFrameJFrame可见之后不要添加组件(setVisible(true))

  • 调用setSize()框架而不是调用pack()(原因JFrame是要调整大小以适合其子组件的首选大小和布局)并且让LayoutManager处理大小不是很好的做法.

  • 使用EDT(Event-Dispatch-Thread)

  • 调用JFrame#setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)如说由@Gilbert勒布朗(+1给他),否则你的EDT /初始线程将保持活动状态,即使之后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)
            }
        });
}
Run Code Online (Sandbox Code Playgroud)


Gil*_*anc 5

你的简单代码缺少一些东西.

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

你应该打电话setDefaultCloseOperationJFrame.

您必须以JFrame正确的顺序调用方法.该setSizepack方法被调用,则该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());
    }

}
Run Code Online (Sandbox Code Playgroud)