关于Swing和使用EDT进行GUI更新,我有几个问题。我刚刚开始阅读这些内容,所以我是这个领域的初学者:
SingUtilities.invokeLater
安排任务,我们将它排入GUI更新任务的当前队列吗? SwingWorker究竟如何确保在EDT上运行done()
方法?它设置以下代码:
future = new FutureTask<T>(callable) {
@Override
protected void done() {
doneEDT();
setState(StateValue.DONE);
}
};
所以我想知道FutureTask是否确保调用invokeLater
?
感谢您的所有答案。
答案 0 :(得分:14)
RepaintManager
来检测大多数违规行为:请参阅this article。actionPerformed
或Action
的{{1}}。ActionListener
调用只是在队列末尾添加invokeLater
。稍后再次使用Runnable
会在之前安排的invokeLater
之后添加新的Runnable
。查看Runnable
doneEDT
答案 1 :(得分:8)
doneEDT()
方法有以下注释:在EDT上完成调用。答案 2 :(得分:0)
SwingWorker确保通过以下代码在EDT上运行done()方法:
Runnable doDone =
new Runnable() {
public void run() {
done();
}
};
if (SwingUtilities.isEventDispatchThread()) {
doDone.run();
} else {
doSubmit.add(doDone);
}
实际上它将doDone变量添加到AccumulativeRunnable doSubmit,
查看AccumulativeRunnable.java的源代码,你会发现它有以下代码
protected void submit(){
SwingUtilities.invokeLater(本);
}
这就是为什么swingworker确保在EDT上运行方法done()的原因
答案 3 :(得分:-1)
1。在Java GUI应用程序中,main()
方法在 Event Dispatcher Thread
中安排GUI的构建后不长,, main()
方法退出...现在它的EDT负责处理GUI。
2. 所以我们不需要在EDT上启动我们的应用,自动完成。
3 始终保持UI工作在UI线程上,非UI工作在非UI线程上。
所以请始终保留您的EDT线程,这是仅用于GUI工作的GUI线程。
例如:
public static void main(String[] args){
EventQueue.invokeLater(new Runnable(){
public void run(){
myframe.setVisible(true);
}
}
}
4. 创建一个单独的非UI线程来处理这个长时间的处理方法。
5. 您可以简单地使用Thread
或使用专门引入Java的SwingWorker
来同步UI和非UI线程。
6. :SwingWorker不会确保在EDT上运行done()方法,而是将其输出同步到EDT线程,这是GUI线程。