什么是SwingUtilities.invokeLater

时间:2012-08-22 16:11:20

标签: java swing swingutilities invokelater

  

可能重复:
  What does SwingUtilities.invokeLater do?
  SwingUtilities.invokeLater

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

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

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

3 个答案:

答案 0 :(得分:10)

1。 Event Dispatcher Thread是GUI主题。

2. 如果您正在谈论main() method ...那么它不会长期存在于Java Gui 中。        在EDT退出时安排GUI构建后的main()方法,现在是处理GUI的 EDT。

3。 invokeLater表示此次调用将立即返回,因为事件已置于事件调度程序队列中,run()方法将< strong>异步运行......

答案 1 :(得分:5)

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

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

答案 2 :(得分:3)

如果您在跟踪guidelines时从EDT更新它,那么不会发生任何不良后果。

那是......

  

如果从事件调度线程调用invokeLater - for   例如,从JButton的ActionListener - doRun.run()仍然会   被推迟到所有未决事件都被处理完毕。

Source

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

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