Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing:不使用EDT创建GUI安全吗?_Java_Swing_Main_Event Dispatch Thread - Fatal编程技术网

Java Swing:不使用EDT创建GUI安全吗?

Java Swing:不使用EDT创建GUI安全吗?,java,swing,main,event-dispatch-thread,Java,Swing,Main,Event Dispatch Thread,在Oracle站点上阅读 为什么初始线程不直接创建GUI本身?因为 几乎所有创建Swing组件或与之交互的代码都必须 在事件分派线程上运行 因此main()不应该在初始线程中创建Swing JFrame,而应该使用SwingUtilities.invokeLater(),至少使用Java 7。这一点也在中进行了解释) 虽然这是非常合乎逻辑的,但我们必须注意,这几乎是教程中从未做过的。 我在别处读到,现代编译器将插入invokeLater()调用,而不告诉程序员。例如,在使用Eclipse时,这是

在Oracle站点上阅读

为什么初始线程不直接创建GUI本身?因为 几乎所有创建Swing组件或与之交互的代码都必须 在事件分派线程上运行

因此
main()
不应该在初始线程中创建Swing JFrame,而应该使用
SwingUtilities.invokeLater()
,至少使用Java 7。这一点也在中进行了解释)

虽然这是非常合乎逻辑的,但我们必须注意,这几乎是教程中从未做过的。 我在别处读到,现代编译器将插入
invokeLater()
调用,而不告诉程序员。例如,在使用Eclipse时,这是真的吗


是否有一些参考来确认这种行为?有不同的情况需要考虑吗?

< P>我认为这些例子不使用<代码> EndoCelAtter()/Case>,因为他们不想使这个例子复杂化(并且他们不想解释<代码> EndoCelAuthor()/代码>,至少在那个时候)。p> 使用事件分派线程的问题仅适用于已经运行UI的情况;大多数这些示例都是从头开始创建UI,因此在调用Swing stuff时它不会运行,在屏幕上实现某些功能之前,就不需要担心用户生成的事件。我想,一个人仍然可以用水管冲洗,但他们几乎不得不这样做


所以我想从头开始创建UI是它自己的特例。

不,是GUI构建工具生成了这样的代码。编译器不敢:这会使它与JLS不兼容。Oracle推荐它,但通常从主线程启动GUI时不会出现问题。这只是为了确保你站在原力的右边;)@SergiyMedvynskyy:正如建议的那样,没有明显的问题。可能;可能。@trashgod:我同意讨论的主题是“使用EDT进行GUI初始化是否是一种良好的做法?”,但我的问题是IDE是否在
main()
binary中自动插入代码以使用EDT。还没有人回答,但从评论来看,我想情况并非如此。因此,没有必要继续朝着错误的方向前进。我也投票反对结束这个问题。我同意你关于为什么教程没有显示这一点的说明,但GUI构建代码可能只是偶然工作,因为它通常不会得到JIT优化。否则,至少会出现一些内存可见性问题。
SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        createAndShowGUI();
    }
});