处理事件调度线程

时间:2010-03-30 19:59:25

标签: java swing awt event-dispatch-thread

我对'事件调度线程'有疑问。我有一个Main类,也是一个JFrame。它初始化代码中的其余组件,其中一些不涉及Swing,其中一些涉及。用这样的EDT简单地初始化Main类就足够了吗?...

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

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

4 个答案:

答案 0 :(得分:6)

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

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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