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

Avr*_*gon 5 java swing swingworker invokelater event-dispatch-thread

从swing工作者与EDT交互的常用方法是使用get()方法.但我有一个很长的任务和代码,如下所示:

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

在大多数tutotials中,建议使用返回值从SwingWorker返回到EDT,但我可以:

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

JB *_*zet 9

你可以,但有SwingWorker的设计报告后台任务的进度的方法:你叫publish()doInBackground()发布的进步,你重写process()(这被称为在美国东部时间),以显示进度.所以上面的代码可以改写为:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)