我在一个匿名SwingWorker
线程下运行一个非常繁重的进程。同时,我正在使用进度条向 GUI 报告进度。然而,Swing 线程让我陷入了困境。它根本没有及时更新任何东西。我不知道该怎么做,因为我尝试从SwingWorker
线程和外部更新 GUI,但都拒绝工作。
如何在繁重的工作线程运行时可靠地更新 Swing UI?
我尝试过的事情
这不起作用(有或没有在invokeLater
命令中换行)。
new LocalCompressor(compressor).execute();
while (!compressionDone) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
int percent = compressor.getPercentDone();
progressBar.setValue(percent);
statusLabel.setText(percent);
}
});
}
此外,尝试从并发测量线程更新 UI 不起作用:
class LocalCompressor extends SwingWorker<Void, Void> {
// [...]
public LocalCompressor(Compressor compressor) {
this.compressor = compressor;
// [...]
}
@Override
protected Void doInBackground() {
final Thread t1 = new Thread(new Runnable() {
@Override
public void run(){
compressor.compress();
}
});
final Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
t1.start();
while (t1.isAlive()) {
updateUI(compressor.getPercentDone());
}
}
});
t2.start();
return null;
}
// [...]
}