Java Swing : why must resize frame, so that can show components have added

不羁的心 提交于 2019-11-26 23:08:36
  • Do not add components to JFrame after the JFrame is visible (setVisible(true))

  • Not really good practice to call setSize() on frame rather call pack() (Causes JFrame to be sized to fit the preferred size and layouts of its subcomponents) and let LayoutManager handle the size.

  • Use EDT (Event-Dispatch-Thread)

  • call JFrame#setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) as said by @Gilbert Le Blanc (+1 to him) or else your EDT/Initial thread will remain active even after JFrame has been closed

Like so:

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)
            }
        });
}

Your simple code is missing a few things.

You have to invoke SwingUtilities to put the Swing components on the event dispatch thread.

You should call the setDefaultCloseOperation on the JFrame.

You have to call the JFrame methods in the correct order. The setSize or pack method is called, then the setVisible method is called last.

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());
    }

}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!