在 Swing 中显示 window 的两种方式有什么区别?

What's the difference between the 2 ways of showing window in Swing?

我是 Java Swing GUI 开发的新手。在一些示例代码中,我看到 Swing window 显示为 EventQueue.invokeLater():

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            // TODO Auto-generated method stub
            MainWindow window=new MainWindow();
            window.setDefaultCloseOperation(EXIT_ON_CLOSE);
            window.setVisible(true);                
        }
    });

    System.out.println("main exited");

}

但正如我所尝试的,我也可以在不使用 EventQueue.invokeLater() 的情况下显示 window:

public static void main(String[] args) {

    MainWindow window=new MainWindow();
    window.setDefaultCloseOperation(EXIT_ON_CLOSE);
    window.setVisible(true);    

    System.out.println("main exited");

}

那有什么区别呢?我应该什么时候使用每种方法?

从 main() 方法调用代码时,您应始终使用 EventQueue.invokeLater(),因为所有 Swing 组件都应在事件调度线程 (EDT) 上创建。

是的,当以另一种方式创建简单的 GUI 时,代码将在 99.99% 的时间内运行,但您不想浪费时间调试一个不起作用的随机错误。

阅读有关 Concurrency and Swing 的 Swing 教程部分,了解有关 EDT 的更多信息以及为什么应在 EDT 上创建 Swing 组件。

注意,从 Swing 侦听器执行的代码是从 EDT 调用的。