2012-11-27 29 views
1

我正在看Java中的GUI的一些示例代码,我想知道显示GUI的正确方式。假设为某些GUI编写了createAndShowGUI()方法。我看到这样的事情:显示Java GUI是否需要特殊处理?

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

难道是错的只是在没有javax.swing中的东西的主要方法的最后调用createAndShowGUI()?或者我想我真正的问题是关于这里发生了什么。我对线程很熟悉,但我不确定为什么有必要创建一个新线程(这是怎么回事?)来显示GUI。

+0

采取措施在Swing事件线程上显示GUI更为安全。您可能只能在主要中显示它,但是再一次,您可能会遇到问题,而且我也看到它也发生了。 –

+2

*“我对线程很熟悉,但我不确定为什么有必要创建一个新线程(就是这里发生了什么?)来显示GUI。”*该代码并没有太多'创建一个新线程'确保在事件调度线程上完成GUI的构建。 –

回答

2

所有与UI(Swing或AWT)的交互都必须从事件分派线程的上下文中执行。 Swing(和AWT)组件不是线程安全的,将其中的任何一个从其他任何线程更改为EDT可能导致损坏的更新,绘制工艺,死锁并可能导致VM崩溃。他们也很难调试。

你可能想通过

我还要补充,在执行main方法有读,它在运行的曾经为它创建的虚拟机。这是保证不是美国东部时间,因为它不会开始启动,直到它需要。

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

1

因为与GUI有关的所有事情都应该通过Event Dispatch ThreadEDT)来完成,所以Java就是这样管理整个接口的。基本上,该方法将传递的Runnable对象的run()方法的执行委托给正确的线程。

介意Runnable不是Thread,它只是一个接口,以提供做一些事情的方法(因此类是可运行)。但是这里没有涉及线程,ThreadRunnable延伸的事实仅仅是因为线程也是可以执行某事的意义上的Runnable对象。

+0

谢谢您的澄清! – CowZow

相关问题