The common way to interact with EDT from swing worker is useing get() method. But i have a long task and code like this:
public Void doInBackground() {
for(Object o : objects) {
doSomething();
MyGlobalGUIConsole.addMessage("Done for " + o);
}
}
In most tutotials is recommended to use return values to get something back from SwingWorker to EDT, but can i just:
public Void doInBackground() {
for(Object o : objects) {
doSomething();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
MyGlobalGUIConsole.addMessage("Done for " + o);
}
});
}
}
You can, but the SwingWorker has methods designed to report progress of a background task: you call publish()
from doInBackground()
to publish progress, and you override process()
(which is called in the EDT) in order to display the progress. So the above code could be rewritten as:
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);
}
}
来源:https://stackoverflow.com/questions/11897647/should-i-use-swingutilities-invokelater-inside-of-swingworker-doinbackground