Java Swing:为什么必须调整框架大小,这样才能显示组件已添加

2022-01-24 00:00:00 layout java swing jscrollpane jframe

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

I have a simple Swing GUI. (and not only this, all swing GUI I have written). When run it, it doesn't show anything except blank screen, until I resize the main frame, so every components have painted again, and I can show them.

这是我的简单代码:

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

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

So, my question is : how can when I start this class, the frame will appear all components I have added, not until I resize frame.

谢谢:)

推荐答案

  • JFrame可见后不要向JFrame添加组件(setVisible(true))

    • Do not add components to JFrame after the JFrame is visible (setVisible(true))

      在框架上调用 setSize() 而不是调用 pack() 并不是很好的做法(导致 JFrame 的大小调整为适合其子组件的首选大小和布局)并让 LayoutManager 处理大小.

      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.

      使用 EDT (Event-Dispatch-线程)

      Use EDT (Event-Dispatch-Thread)

      调用 JFrame#setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) 正如@Gilbert Le Blanc(对他 +1)所说,否则即使在 之后,您的 EDT/Initial 线程仍将保持活动状态JFrame 已关闭

      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

      像这样:

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

相关文章