Swing:不使用 EDT 创建 GUI 是不是安全? [复制]
Posted
技术标签:
【中文标题】Swing:不使用 EDT 创建 GUI 是不是安全? [复制]【英文标题】:Swing: Is this safe to not use the EDT to create the GUI? [duplicate]Swing:不使用 EDT 创建 GUI 是否安全? [复制] 【发布时间】: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所建议的那样。 可能duplicate;可能duplicate. @trashgod:我同意讨论将围绕“使用 EDT 进行 GUI 初始化是一种好习惯吗?”,但是我的问题是关于 IDE 在@987654330 中自动插入或不插入代码@binary 使用 EDT。尚未得到答复,但从 cmets 来看,我想情况并非如此。所以没有必要继续错误的方向。我也投票结束了这个问题。 【参考方案1】:我认为这些示例不使用invokeLater()
,因为他们不想使示例复杂化(并且他们不想解释invokeLater()
,至少在这一点上)。
使用事件调度线程的问题仅适用于已经有 UI 运行的情况;这些示例大多是从头开始创建 UI,因此在调用 Swing 内容时它不会运行,直到屏幕上实现某些内容,然后才需要担心用户生成的事件。我想一个人仍然可能会被灌醉,但他们几乎不得不尝试这样做。
所以我猜从头开始创建 UI 是它自己的特殊情况。
【讨论】:
我同意您关于为什么教程没有显示这一点的注释,但 GUI 构建代码可能只是偶然地工作,因为它通常没有得到 JIT 优化。否则,您至少会遇到一些内存可见性问题。以上是关于Swing:不使用 EDT 创建 GUI 是不是安全? [复制]的主要内容,如果未能解决你的问题,请参考以下文章