匿名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;
}
// [...]
}