我应该在SwingWorker.doInBackground()中使用SwingUtilities.invokeLater()吗?

时间:2012-08-10 08:02:38

标签: java swing swingworker event-dispatch-thread invokelater

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

1 个答案:

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