5

从 swing worker 与 EDT 交互的常用方法是使用 get() 方法。但我有一个很长的任务和这样的代码:

public Void doInBackground() {
    for(Object o : objects) {
         doSomething();
         MyGlobalGUIConsole.addMessage("Done for " + o);
    }
}

在大多数教程中,建议使用返回值从 SwingWorker 将某些内容返回到 EDT,但我可以:

public Void doInBackground() {
    for(Object o : objects) {
        doSomething();
        SwingUtilities.invokeLater(new Runnable() {        
            @Override                                      
            public void run() {                            
                MyGlobalGUIConsole.addMessage("Done for " + o);
            }                                              
        });                                                
    }
}
4

1 回答 1

9

可以,但是 SwingWorker 具有旨在报告后台任务进度的方法:您调用publish()fromdoInBackground()以发布进度,并覆盖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);
    }
}
于 2012-08-10T08:11:06.963 回答