对于Swing应用程序,我们使用EventQueue.invokeLater()
是否有原因?应该Thread.start()
以同样的方式工作吗?
Thread.start的另一个优点是我们有一种告诉线程中断的方法,因为EventQueue.invokeLater
没有为我们提供Thread
对象。
答案 0 :(得分:3)
您应该使用EventQueue.invokeLater进行所有GUI更新,因为Swing在某种程度上是单线程的。见http://docs.oracle.com/javase/6/docs/api/javax/swing/package-summary.html#threading
您可以启动线程来进行计算等,但应该使用invokeLater更新GUI。
答案 1 :(得分:2)
启动Swing应用程序的两个选项是:
EventQueue.invokeLater()
和
SwingUtilities.invokeLater()
我的偏好是使用SwingUtilities。他们都将runnable放在Event Dispatch thread(EDT)上。你不需要处理EDT。
你的代码在EDT上,或者另一个invokeLater()方法的调用将把runnable放在EDT上。您可以使用SwingUtilities.isEventDispatchThread()方法调用确定任一条件。
Thread.start()方法适用于您自己的工作线程。或者,如果您愿意,可以将javax.swing.SwingWorker类用于您自己的Swing工作线程。
这是我用来启动我编写的每个Swing应用程序的样板文件。
package com.ggl.game2048;
import javax.swing.SwingUtilities;
import com.ggl.game2048.model.Game2048Model;
import com.ggl.game2048.view.Game2048Frame;
public class Game2048 implements Runnable {
@Override
public void run() {
new Game2048Frame(new Game2048Model());
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Game2048());
}
}
简短而重要。这堂课做了3件事。
您可以在我的Java文章中看到2048 Swing application的其余部分。