1

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

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

在没有 javax.swing 的情况下在 main 方法的末尾调用 createAndShowGUI() 会不会是错误的?或者我想我真正的问题是关于这里发生了什么。我对线程很熟悉,但我不确定为什么需要创建一个新线程(这是怎么回事?)来显示 GUI。

4

2 回答 2

2

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

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

您可能想通读

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

这就是为什么好的 Swing 程序总是以EventQueue.invokeLater. 您也可以使用SwingUtilities.invokeLater,但通常是一样的。

于 2012-11-27T04:40:44.370 回答
1

因为与 GUI 相关的所有事情都应该通过事件调度线程( EDT ) 完成,这就是 Java 管理整个界面绘制的方式。基本上,该run()方法将传递Runnable对象的方法的执行委托给正确的线程。

请注意,这Runnable不是 a Thread,它只是提供执行某些操作的方法的接口(因此该类是runnable)。但是这里没有涉及线程,Threadextend from的事实Runnable只是因为线程也是Runnable可以执行某些东西的对象。

于 2012-11-27T04:37:06.097 回答