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
可见之后,不要将组件添加到JFrame
(setVisible(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
方法。 调用setSize
或pack
方法,然后调用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()); } }