2010-03-30 72 views
3

我有一个关于“事件调度线程”的问题。我有一个也是JFrame的Main类。它初始化代码中的其余组件,其中一些不涉及Swing,其中一些组件。它是足够使用EDT这样简单地初始化主阶级?......处理事件调度线程

public static void main(String[] args) { 
    javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      new Main(); 
     } 
    }); 
} 

这样一切都会在事件调度线程上运行。

+0

正确的名称是Event Dispatch Thread。请修改您的标题和帖子。 – 2010-09-30 18:15:53

回答

6

也就是说,直到你开始利用后台线程计算,数据采集等,通常是足够的。然后,你需要开始小心,以验证您是在美国东部时间之前改变一个Swing组件或它的模型。

无论你是在美国东部时间与执行,您可以测试:

if (SwingUtilities.isEventDispatchThread()) { 
     // Yes, manipulate swing components 
    } else { 
     // No, use invokeLater() to schedule work on the EDT 
    } 

此外,请参阅SwingWorker类如何工作移交给后台线程和处理结果在EDT

细节
+0

我相信我会需要它以备将来参考。现在我的应用程序是单线程的,所以我应该没问题。谢谢! – bcoughlan 2010-03-30 20:09:14

2

这是要走的路。唯一需要注意的是如果一个你使用Swing组件注册的监听器会产生一个新的Thread(通常用于执行一些长时间的计算)。如果要执行GUI操作,这些新线程将需要使用invokeLater

2

这就是Sun教程中所有示例的工作方式。请阅读Swing教程Concurrency中的部分,以获取更多关于这种方式的原因。

1

Devon_C_Miller的答案是正确的。我只想指出调用事件派发线程的快捷方式。

下面是我如何启动我所有的Swing应用程序。

import javax.swing.SwingUtilities; 

import com.ggl.source.search.model.SourceSearchModel; 
import com.ggl.source.search.view.SourceSearchFrame; 

public class SourceSearch implements Runnable { 

    @Override 
    public void run() { 
     new SourceSearchFrame(new SourceSearchModel()); 

    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new SourceSearch()); 
    } 

} 

只需更改名称即可将其复制到每个Swing项目中。