Sum*_*udu 4 java swing invokelater runnable swingutilities
这个简单的问题让我很困惑.您可以通过设置frames的setVisible属性来显示JAVA GUI应用程序true.但在我在互联网上发现的几乎所有例子中,他们都使用一个单独的线程来做同样的事情.
他们这样做,
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Frame().setvisible(true); //just take the idea of this line
}
});
Run Code Online (Sandbox Code Playgroud)
我发现这两种方法没有区别.但必须有一些特殊的原因,这就是每个人都这样做的原因.
有人可以解释一下......谢谢!
以这种方式启动应用程序的主要原因是Swing组件不是线程安全的,因此您需要保证GUI将从哪个线程开始:称为Event Dispatching Thread(EDT).如果不这样做,你就无法确定它将从哪个线程开始,但正如几位评论员所指出的那样,主线程保证不是 EDT.
您应该只在EDT中创建,访问或修改UI组件.否则将导致意外行为(如果您很幸运)和/或脏重绘.
我建议您熟悉一些资源:
您还可以阅读为什么我的样板Java桌面应用程序JFrame在main方法中使用EventQueue.invokeLater?
UPDATE
这是我一直试图找到的博客:P
这基本上解释了为什么main在开始之前将您与EDT 同步很重要,它还描述了有关原因的一些细节.
它还描述了为什么许多开发人员在启动他们的应用程序时犯了这个根本性的错误(基本上,我们被告知我们可以,但我们从未真正允许......糟糕的我们)