Should i use SwingUtilities.invokeLater() inside o

2020-07-13 10:16发布

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);
            }                                              
        });                                                
    }
}

1条回答
看我几分像从前
2楼-- · 2020-07-13 11:02

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);
    }
}
查看更多
登录 后发表回答