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

我有一个简单的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); } 

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

谢谢 :)

  • JFrame可见之后,不要将组件添加到JFramesetVisible(true)

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

  • 使用EDT (Event-Dispatch-Thread)

  • 调用JFrame#setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)如@Gilbert Le Blanc(+1给他)所示,否则即使在JFrame closures后,您的EDT / Initial线程也将保持活动状态

像这样:

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

你简单的代码缺less一些东西。

您必须调用SwingUtilities才能将Swing组件放到事件派发线程中。

您应该调用JFrame上的setDefaultCloseOperation

您必须以正确的顺序调用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()); } }