get()
就像join()
它会一直阻塞直到被调用一样,并且会等待SwingWorker完成之后才被调用。错误地使用它可以完全抵消使用SwingWorker的所有优势。
解决方案:在get()
知道SwingWorker已完成处理之前,不要调用它,done()
方法是在SwingWorker的方法中调用它,或者如果需要从调用代码中调用它,则在已添加到SwingWorker的Propertychangelistener中当SwingWorker的“状态”属性为SwingWorker.StateValue.DONE时。
就像是:
final FileLoader loader = new FileLoader(filePath);
loader.addPropertychangelistener(new Propertychangelistener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("state".equals(evt.getPropertyName())) {
// since DONE is enum, no need for equals(...) method
if (evt.getNewValue() == SwingWorker.StateValue.DONE) {
try {
loader.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
}
});
new ProgressWindow(loader, "Loading File", "Loading File");
注意:未经编译或测试的代码
编辑:尝试/捕获添加。