我应该用SwingWorker.doInBackground的SwingUtilities.invo

2019-07-30 21:17发布

从摆动工作者EDT进行交互的常用方法是期运用get()方法。 但我有一个长期的任务,这样的代码:

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

在大多数tutotials建议使用返回值得到的东西从SwingWorker的到美国东部时间回来,但我能不能:

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

Answer 1:

你可以,但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);
    }
}


文章来源: Should i use SwingUtilities.invokeLater() inside of SwingWorker.doInBackground()?