Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Should i use SwingUtilities.invokeLater() inside of SwingWorker.doInBackground()?

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);
            }                                              
        });                                                
    }
}
like image 639
AvrDragon Avatar asked Aug 10 '12 08:08

AvrDragon


1 Answers

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);
    }
}
like image 111
JB Nizet Avatar answered Oct 04 '22 21:10

JB Nizet