【发布时间】:2014-11-15 12:53:37
【问题描述】:
在 Oracle 网站上阅读 last paragraph。
为什么初始线程不简单地创建 GUI 本身?因为 几乎所有创建或与 Swing 组件交互的代码都必须 在事件派发线程上运行。
所以main() 不应该在初始线程中创建 Swing JFrame,而应该使用 SwingUtilities.invokeLater(),至少到 Java 7。 this Q/A 中也对此进行了说明。
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
虽然这是非常合乎逻辑的,但我们必须观察到这在教程中几乎从未完成。
我在别处读到,现代编译器会在不告诉程序员的情况下自行插入invokeLater() 调用。这是真的吗,例如在使用 Eclipse 时?
是否有一些参考来确认这种行为?是否有不同的情况需要考虑?
【问题讨论】:
-
不,是GUI构建工具会生成这样的代码。编译器不敢:它会使其不符合 JLS。
-
Oracle 推荐的,但通常从主线程启动 GUI 时不会出现问题。这只是为了确保你在力量的右侧;)
-
@SergiyMedvynskyy:没有明显问题,正如here所建议的那样。
-
@trashgod:我同意讨论将围绕“使用 EDT 进行 GUI 初始化是一种好习惯吗?”,但是我的问题是关于 IDE 在@987654330 中自动插入或不插入代码@binary 使用 EDT。尚未得到答复,但从 cmets 来看,我想情况并非如此。所以没有必要继续错误的方向。我也投票结束了这个问题。
标签: java swing main event-dispatch-thread