Java Swing对话框布局:运行方法还是构造函数?
当我启动Swing对话框布局时,是否在类的run方法中执行该布局是否会产生差异: public void run() { frame = new JFrame(); ... frame.setVisible( true ); } 公开募捐 { frame=新的JFrame(); ... frame.setVisible(true); } 还是类构造函数 public MyClass { frame = new JFrame(); ... frame.setVisible( true ); } public void run() { } 公共MyClass { frame=新的JFrame(); ... frame.setVisible(true); } 公开募捐 { }Java Swing对话框布局:运行方法还是构造函数?,java,multithreading,swing,Java,Multithreading,Swing,当我启动Swing对话框布局时,是否在类的run方法中执行该布局是否会产生差异: public void run() { frame = new JFrame(); ... frame.setVisible( true ); } 公开募捐 { frame=新的JFrame(); ... frame.setVisible(true); } 还是类构造函数 public MyClass { frame = new
谢谢是的,这很重要,原因是您应该在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()
方法。这是上下文的。正如@hovercraftfullofeels所指出的,您需要确保所有UI代码都在EDT
中执行,包括初始化
如果您已经在EDT
中运行,则不需要使用InvokeLater
(除非您真的想要),否则必须将调用重新同步到EDT
最好使用EventQueue.isDispatchingThread