hqt*_*hqt 4 java layout swing jframe jscrollpane
我有一个简单的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);
}
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是:当我开始这个课时,框架会出现我添加的所有组件,直到我调整框架大小.
谢谢 :)
Dav*_*amp 13
JFrame在JFrame可见之后不要添加组件(setVisible(true))
调用setSize()框架而不是调用pack()(原因JFrame是要调整大小以适合其子组件的首选大小和布局)并且让LayoutManager处理大小不是很好的做法.
使用EDT(Event-Dispatch-Thread)
调用JFrame#setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)如说由@Gilbert勒布朗(+1给他),否则你的EDT /初始线程将保持活动状态,即使之后JFrame已关闭
像这样:
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)
}
});
}
Run Code Online (Sandbox Code Playgroud)
你的简单代码缺少一些东西.
您必须调用SwingUtilities以将Swing组件放在事件派发线程上.
你应该打电话setDefaultCloseOperation给JFrame.
您必须以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());
}
}
Run Code Online (Sandbox Code Playgroud)