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

时间:2015-03-28 01:44:58

标签: java swing swingx

我是Java Swing GUI开发的新手。在一些示例代码中,我看到Swing窗口显示为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()的情况下显示一个窗口:

public static void main(String[] args) {

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

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

}

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

1 个答案:

答案 0 :(得分:4)

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

是的,在以其他方式创建简单的GUI时,代码将有99.99%的时间工作,但您不想浪费时间调试随机错误。

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

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