【问题标题】:Handling the Event Dispatch Thread处理事件调度线程
【发布时间】:2011-02-02 15:29:04
【问题描述】:

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

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

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

【问题讨论】:

  • 正确的名称是事件调度线程。请编辑您的标题和帖子。

标签: java swing awt event-dispatch-thread


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 我确定我需要它以供将来参考。现在我的应用程序是单线程的,所以我应该没问题。谢谢!
    【解决方案3】:

    这就是 Sun 教程中所有示例的工作方式。阅读 Concurrency 上的 Swing 教程中的部分,了解有关为什么这样做的更多信息。

    【讨论】:

      【解决方案4】:

      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 项目,只需更改名称即可。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        • 1970-01-01
        • 2016-02-07
        • 2012-10-03
        • 1970-01-01
        相关资源
        最近更新 更多