处理事件调度线程
我有一个关于’事件派遣线程’的问题。 我有一个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项目。