Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.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 什么是SwingUtilities.invokeLater_Java_Swing_Swingutilities_Invokelater - Fatal编程技术网

Java 什么是SwingUtilities.invokeLater

Java 什么是SwingUtilities.invokeLater,java,swing,swingutilities,invokelater,Java,Swing,Swingutilities,Invokelater,可能重复: 这段代码我已经看过几百次了: public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } 现在我的问题是:invokeLater()做什么?如果我只是在主线程中创建并显示GUI,会发生

可能重复:

这段代码我已经看过几百次了:

public static void main(String[] args) {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
          createAndShowGUI();
        }
    });
}

现在我的问题是:
invokeLater()
做什么?如果我只是在主线程中创建并显示GUI,会发生什么样的坏事?

Swing不是线程安全的,对Swing对象的所有更改都必须在事件调度线程中执行。如果您试图在它之外运行代码,您将得到未指定的行为,这可能会在某个时候变得奇怪


相反,Eclipse使用的SWT/JFace GUI框架在每个公共入口点上断言正确的线程。

如果您在执行以下操作时从EDT进行更新,则不会发生任何错误

那就是

如果从事件调度线程调用invokeLater——对于 例如,从JButton的ActionListener——doRun.run()仍将 将延迟到处理完所有挂起的事件

如果不是这样,则需要调用调用器()


它调度将在EDT(事件调度线程)上执行的
Runnable

1。
事件调度线程
是GUI线程

2.如果您谈论的是
main()方法
…那么它在Java Gui中的使用时间不长。
main()
方法在EDT中调度GUI构造后退出,现在处理GUI的EDT。


3.
invokeLater
意味着当事件被放置在事件调度程序队列中时,该调用将立即返回,并且
run()
方法将异步运行…

“invokeLater()做什么?”在SwingUtilities javadoc页面中回答,正如您可能期望的那样。。“如果您试图在EDT之外运行代码,您只会得到一个异常,因为在任何进一步的操作之前都会检查调用线程”?在EDT之外运行UI可能会产生奇怪的行为,但不一定会引发异常。不仅是更改-每次访问(包括实例化)必须在EDT上该异常仅限于JavaFX中的情况,在JavaFX中,他们最终包含了该检查。通过使用自定义重绘管理器,您可以在Swing中有类似的行为,如@assylias和Robin所解释的,感谢您的更正。我同时使用Swing和SWT/JFace,并将它们混合在一起。大多数情况下,您都是从
一个线程
。你是说
不是主线程
?-1没有什么不好的(很不幸今天没有投票;-)请编辑你的答案以正确解释你的真正意思。因此,如果我把我的代码放在
invokeLater()
中,Runnable将从EDT执行,并且没有“奇怪的行为”(如assylias所述)将被创建?如果我想,比如说,更新我的JLabel的文本呢?我应该正式将其放入
invokeLater()中吗< 11684】是的,你应该,除非你知道你已经在EDT中了。@ 11684但是,即使你在EDT中,VooCeltAt仍然可以工作,所以你不妨使用它。嗯…请考虑使用技术词汇,这样我们都能明白你的意思。(不长寿或不同时运行,这意味着要么错误,要么模棱两可;-)