【问题标题】:Why does my boilerplate Java desktop app JFrame use EventQueue.invokeLater in the main method?为什么我的样板 Java 桌面应用程序 JFrame 在 main 方法中使用 EventQueue.invokeLater?
【发布时间】:2011-11-18 08:46:10
【问题描述】:

我正在使用最新的 Eclipse 和 GWT Designer 来用 Java 制作一个摇摆应用程序。 工具自动生成的我的应用程序窗口(即 javax.swing.JFrame)中的主要功能如下所示:

    /* launch the application */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                AppWindow window = new AppWindow();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

这似乎有很多关于可能只是这样的噪音:

public static void main(String[] args) {
            try {
                AppWindow window = new AppWindow();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }


}

我读到在某些情况下需要 EventQueue.InvokeLater 技术,另一个问题是在哪里使用它here

我的问题比较简单;为什么在这里的代码生成器中自动执行此操作?为什么 main 应该快速返回,让事件队列稍后创建应用程序窗口?阻塞不是重点吗?为什么 JFrame 自动生成的设计器要做这个 EventQueue 的东西?我试图在启动和显示表单方面看到一些差异,无论这段代码是用更简单的方式还是用更难的方式完成,我只能暂时得出结论,这有一些在初学者制作的微型演示应用程序中看不到的好处像我一样,也许在现实世界中基于大型复杂 Jframe 的类中,这种延迟/排队策略有一些好处?

【问题讨论】:

  • 另见Initial Threadsanswer
  • 因为我似乎需要它很多,所以我在 Eclipse 中制作了一个模板,以便将这个样板事件队列内容轻松放入代码中。 il 然后是控制空间,扩展到上面的整个混乱。
  • 我在 NetBeans 中使用了类似的方法。
  • 这不是关于“快速离开 main”,而是关于将创作推到 EDT 上。

标签: java swing


【解决方案1】:

1) 为什么要在 try-catch-finally 中构建 Swing GUI,我看不出任何原因,将创建非线程安全 GUI 和非线程安全代码拆分到单独的线程,

2) Swing 不是线程安全的,那么在所有情况下pack() + setVisible(true) 都是正确的

  • 最后一个与 GUI 相关的代码行

  • 封装到invokeLater

  • 忘记了一些代码示例ExamplesDepots,这个论坛,另一个论坛,确保这些代码有效,但有可能发生任何/一切的风险

  • 正确的 Swing GUI 启动

例如

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            AppWindow window = new AppWindow();
            window.frame.setVisible(true);            
        }
    });
  }

3) 是否有一些可序列化的Custom L&F 然后(更好)包装到invokeAndWait

【讨论】:

    【解决方案2】:

    根据您的应用程序及其使用方式,在调用您的main 方法之前或期间,屏幕上可能会出现一些东西(因此使用EventQueue)。修改任何 UI 组件的调用应在 Event Dispatch Thread 上进行,这包括将应用程序设置为可见。

    所以为了安全起见,最好在 EDT 上启动您的应用程序。

    为什么这里的代码生成器会自动执行此操作?

    不会有什么坏处,很容易生成,被认为是很好的做法。

    为什么main要快速返回,让事件队列稍后创建应用程序窗口?

    main 方法可能是从使用EDT 的其他应用程序调用的,并且可能已经在屏幕上绘制了一些东西。如果您直接在main 中绘制应用程序,则您的应用程序可能正在更改正在由EDT 上的某些东西处理的某些组件,并且可能已经在屏幕上绘制。

    所以为了万一这种情况发生时的安全起见,您应该把它留给EDT 来绘制您的应用程序,这样它就可以在不干扰其他任何事情的情况下进行绘制。

    阻塞不是重点吗?

    除非有其他东西在调用main,而不是您的用户通过双击桌面图标启动的 JVM 进程,否则只要屏幕上有东西,main 返回时不会有什么不同。

    我只能暂时得出结论,这有一些在像我这样的初学者制作的微型演示应用程序中看不到的好处

    您是对的 - 大多数情况下它可能不会产生影响,但我认为他们包含它是因为它易于生成和实施,不会造成伤害,并且可以作为良好实践的例证。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      • 2014-07-22
      • 1970-01-01
      • 2012-01-22
      • 1970-01-01
      相关资源
      最近更新 更多