与swing工作者交互EDT的常用方法是使用get()方法。但是我有一个很长的任务和代码:
public Void doInBackground() {
for(Object o : objects) {
doSomething();
MyGlobalGUIConsole.addMessage("Done for " + o);
}
}
在大多数tutotials中建议使用返回值从SwingWorker返回到EDT,但我可以这样做:
public Void doInBackground() {
for(Object o : objects) {
doSomething();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
MyGlobalGUIConsole.addMessage("Done for " + o);
}
});
}
}
答案 0 :(得分:9)
您可以,但SwingWorker具有用于报告后台任务进度的方法:您从publish()
调用doInBackground()
来发布进度,并覆盖process()
(在EDT)以显示进度。所以上面的代码可以改写为:
public Void doInBackground() {
for(Object o : objects) {
doSomething();
publish("Done for " + o);
}
}
@Override
protected void process(List<String> messages) {
for (String message : messages) {
MyGlobalGUIConsole.addMessage(message);
}
}