在Oracle网站上阅读last paragraph。
为什么初始线程不是简单地创建GUI本身?因为 几乎所有创建Swing组件或与Swing组件交互的代码都必须 在事件派发线程上运行。
所以main()
不应该在初始线程中创建Swing JFrame,而应该使用SwingUtilities.invokeLater()
,至少使用Java 7。这也在this Q/A)中解释。
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
虽然这是非常符合逻辑的,但我们必须注意到这在教程中几乎从不完成。
我在其他地方读过,现代编译器会在不告诉程序员的情况下自己插入invokeLater()
调用。这是真的吗,例如在使用Eclipse时?
是否有一些参考来确认此行为?是否有不同的案例需要考虑?
答案 0 :(得分:1)
我认为这些示例不会使用invokeLater()
,因为他们不想让示例复杂化(他们不想解释invokeLater()
,至少在那一点)。
使用事件调度线程的问题仅适用于已经运行的UI的情况;这些示例主要是从头开始创建UI,因此在调用Swing内容时它不会运行,并且直到屏幕上实现某些内容,然后就不会担心用户生成的事件。我想,人们仍然可能会受到冲击,但他们几乎不得不尝试这样做。
所以我想从头开始创建UI是它自己的特殊情况。