我对'事件调度线程'有疑问。我有一个Main类,也是一个JFrame。它初始化代码中的其余组件,其中一些不涉及Swing,其中一些涉及。用这样的EDT简单地初始化Main类就足够了吗?...
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Main();
}
});
}
这样一切都将在Event Dispatcher线程上运行。
答案 0 :(得分:6)
在您开始使用后台线程进行计算,数据采集等之前,通常就足够了。然后,在更改swing组件或其模型之前,您需要开始小心验证您是否在EDT上。
您可以使用以下方法测试您是否在EDT上执行:
if (SwingUtilities.isEventDispatchThread()) {
// Yes, manipulate swing components
} else {
// No, use invokeLater() to schedule work on the EDT
}
另外,请参阅SwingWorker课程,详细了解如何将工作交给后台线程并在EDT上处理结果
答案 1 :(得分:2)
这是要走的路。你应该注意的唯一事情是你注册Swing组件的监听器是否会产生一个新的Thread(通常用于执行一些长计算)。如果要执行GUI操作,这些新线程将需要使用invokeLater
。
答案 2 :(得分:2)
这就是Sun教程中所有示例的工作方式。阅读Concurrency上Swing教程中的部分,了解有关为何以这种方式完成的更多信息。
答案 3 :(得分:2)
Devon_C_Miller的回答是正确的。我只是想指出一个调用事件派发线程的快捷方式。
以下是我启动所有Swing应用程序的方法。
import javax.swing.SwingUtilities;
import com.ggl.source.search.model.SourceSearchModel;
import com.ggl.source.search.view.SourceSearchFrame;
public class SourceSearch implements Runnable {
@Override
public void run() {
new SourceSearchFrame(new SourceSearchModel());
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new SourceSearch());
}
}
只需更改名称,即可将其复制到每个Swing项目中。