swing显示JavaGUI是否需要特殊处理?
我在看Java中GUI的一些示例代码,我想知道显示GUI的正确方式是什么。假设为某些GUI编写了createAndShowGUI()方法。我看到了这样的情况:
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
如果不使用javax,只在main方法的末尾调用createAndShowGUI()是错误的。荡秋千?或者我想我真正的问题是这里发生了什么。我对线程很熟悉,但我不确定为什么有必要创建一个新线程(这里是这样吗?)以显示GUI
# 1 楼答案
因为与GUI相关的一切都应该通过Event Dispatch Thread(EDT)完成,这就是Java管理整个接口绘图的方式。基本上,该方法将传递的
Runnable
对象的run()
方法的执行委托给正确的线程请注意
Runnable
不是一个Thread
,它只是一个接口,提供一个执行某些操作的方法(因此类是可运行的)。但是这里没有涉及线程,Thread
从Runnable
扩展的事实只是因为线程也是一个Runnable
对象,可以执行某些东西# 2 楼答案
与UI(Swing或AWT)的所有交互都必须在事件调度线程的上下文中执行
Swing(和AWT)组件不是线程安全的,从EDT以外的任何线程更改它们中的任何一个都可能导致损坏的更新、绘制技巧、死锁,并可能导致VM崩溃。众所周知,它们也很难调试
你可能想通读一遍
我还应该补充,当执行
main
方法时,它正在VM为它创建的任何线程中运行。这保证不是EDT,因为在需要之前它不会开始这就是为什么好的Swing程序总是以类似^{的东西开始。您也可以使用
SwingUtilities.invokeLater
,但基本上是一样的