Java Swing:为什么必须调整框架大小,这样才能显示组件已添加
我有一个简单的 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 theJFrame
is visible (setVisible(true)
)在框架上调用
setSize()
而不是调用pack()
并不是很好的做法(导致JFrame
的大小调整为适合其子组件的首选大小和布局)并让LayoutManager
处理大小.Not really good practice to call
setSize()
on frame rather callpack()
(CausesJFrame
to be sized to fit the preferred size and layouts of its subcomponents) and letLayoutManager
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 afterJFrame
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) } }); }
相关文章