当我启动我的Swing对话框布局时,是否在类的run方法中执行它会有所不同:
public void run() { frame = new JFrame(); ... frame.setVisible( true ); }
或类构造函数?
public MyClass { frame = new JFrame(); ... frame.setVisible( true ); } public void run() { }
由于
答案 0 :(得分:4)
是的,这很重要,原因是你应该在Swing事件线程(事件调度线程或EDT)上调用大多数Swing代码,包括创建JFrame。为此,您通常在Runnable中创建Swing GUI,并通过调用类似以下内容的方式将Runnable排入事件线程:
SwingUtilities.invokeLater(new Runnable(){
public void run() {
// create your Swing GUI here
frame = new JFrame();
...
frame.setVisible( true );
}
});
例外情况是API中记录的Swing方法调用是线程安全的,例如组件的repaint()
方法。
答案 1 :(得分:3)
这是背景。正如@hovercraftfullofeels指出的那样,您需要确保所有UI代码都在EDT
中执行,包括初始化。
如果你已经在EDT
中运行,那么就不需要使用InvokeLater
(除非你真的想要),否则你必须将呼叫重新同步回{ {1}}。
最好查看EDT