处理事件调度线程

我有一个关于’事件派遣线程’的问题。 我有一个Main类,也是一个JFrame。 它初始化代码中的其余组件,其中一些不涉及Swing,其中一些涉及。 用这样的EDT简单地初始化Main类就足够了吗?…

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

这样一切都将在Event Dispatcher线程上运行。

这通常就足够了,直到您开始使用后台线程进行计算,数据采集等。然后,您需要在更改摆动组件或其模型之前开始小心validation您是否在EDT上。

你可以用以下方法测试你是否在EDT上执行:

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

另外,请参阅SwingWorker类,了解有关如何将工作交给后台线程并在EDT上处理结果的详细信息

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

这就是Sun教程中所有示例的工作方式。 阅读有关并发的Swing教程的部分,了解有关为何以这种方式完成的更多信息。

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项目。