[英]Java Swing - running on EDT
关于Swing和使用EDT进行GUI更新,我有几个问题。 我刚刚开始阅读这些内容,所以我是这个领域的初学者:
SwingUtilities.invokeLater
安排任务,我们将它排入GUI更新任务(EDT)的当前队列对吗? SwingWorker究竟如何确保在EDT上运行done()
方法? 它设置以下代码:
future = new FutureTask<T>(callable) { @Override protected void done() { doneEDT(); setState(StateValue.DONE); } };
所以我想知道FutureTask是否确保调用invokeLater
?
谢谢你的所有答案。
RepaintManager
来检测大多数此类违规:请参阅此文章 。 Action
或ActionListener
的actionPerformed
。 invokeLater
调用只是在队列末尾添加Runnable
。 使用invokeLater
第二时间稍晚将增加这个新Runnable
以前调度后Runnable
。 看看doneEDT
的代码
private void doneEDT() { Runnable doDone = new Runnable() { public void run() { done(); } }; if (SwingUtilities.isEventDispatchThread()) { doDone.run(); } else { doSubmit.add(doDone); } }
doneEDT()
方法具有以下注释: 在EDT上完成调用 。 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()的原因
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线程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.