我正在查看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。
答案 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 )。但是这里没有涉及任何线程,Thread
从Runnable
扩展的事实只是因为一个线程也是一个Runnable
对象,在某种意义上可以执行某些东西。