15

可能重复:
SwingUtilities.invokeLater 做什么?
SwingUtilities.invokeLater

我已经看过数百次这样的小代码:

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

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

4

3 回答 3

10

1. Event Dispatcher Thread是GUI线程。

2.如果你在谈论main() method...那么它在 Java Gui 中的寿命并不长main()在 EDT 中调度 GUI 的构建后的方法退出,现在它的EDT 处理 GUI。

3. invokeLater表示此调用将在事件放入Event Dispatcher Queue 时立即返回run(),并且方法将异步运行...

于 2012-08-22T16:17:01.197 回答
4

Swing 不是线程安全的,对 Swing 对象的所有更改都必须在 Event Dispatch Thread 中执行。如果你试图在它之外运行你的代码,你会得到未指定的行为,这在某些时候可能会变得很奇怪。

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

于 2012-08-22T16:14:00.447 回答
2

如果您在遵循指南的同时从 EDT 更新它,则不会发生任何不好的事情。

那是...

如果从事件分派线程调用​​ invokeLater ——例如,从 JButton 的 ActionListener —— doRun.run() 仍将被推迟,直到所有未决事件都已处理完毕。

来源

如果不是这种情况,invokeLater()则需要。

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

于 2012-08-22T16:15:11.913 回答