显示Java GUI需要一些特殊处理吗?

时间:2012-11-27 04:34:50

标签: java swing event-dispatch-thread

我正在查看Java中的一些GUI示例代码,我想知道显示GUI的正确方法是什么。假设为某些GUI编写了createAndShowGUI()方法。我看到这样的事情:

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

在主方法结束时调用createAndShowGUI()而不使用javax.swing是不是错了?或者我想我真正的问题是关于这里发生了什么。我对线程很熟悉,但我不确定为什么需要创建一个新线程(这就是这里发生了什么?)来显示GUI。

2 个答案:

答案 0 :(得分:2)

必须在事件调度线程的上下文中执行与UI(Swing或AWT)的所有交互。

Swing(和AWT)组件不是线程安全的,从EDT以外的任何线程更改它们中的任何一个都可能导致更新损坏,绘制图形,死锁并可能导致VM崩溃。众所周知,它们也很难调试。

您可能希望阅读

我还应该补充一点,当执行main方法时,它正在为VM创建的线程中运行。这保证不是EDT,因为它不会在需要之前开始。

这就是为什么优秀的Swing程序总是以EventQueue.invokeLater之类的东西开头。你也可以使用SwingUtilities.invokeLater,但它通常都是一样的。

答案 1 :(得分:1)

因为与GUI相关的所有内容都应该通过Event Dispatch Thread EDT )完成,这就是Java管理整个接口绘图的方式。基本上,该方法将传递的run()对象的Runnable方法的执行委托给正确的线程。

请注意Runnable不是Thread,它只是一个提供某种方法的接口(因此该类是 runnable )。但是这里没有涉及任何线程,ThreadRunnable扩展的事实只是因为一个线程也是一个Runnable对象,在某种意义上可以执行某些东西。