3

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

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

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

4

4 回答 4

6

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

您可以通过以下方式测试您是否在 EDT 上执行:

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

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

于 2010-03-30T20:07:05.150 回答
2

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

于 2010-03-30T20:04:28.230 回答
2

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

于 2010-03-30T20:07:33.507 回答
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 项目,只需更改名称即可。

于 2013-02-20T15:44:50.530 回答