SwingWorker
これは、実装によって簡単に管理できるはずです。SwingWorker
s は、「何かをする」必要があるが、実行中に GUI をブロックしたくない場合に役立ちます。このクラスは、メソッドを介して他の作業を行っている間に GUI コンポーネントを更新する必要がある場合に、EDT に通信するための便利な API も提供しますpublish()/process()
。
以下の実装では、EDT (GUI スレッド) をブロックしないように、ワーカー スレッドでループを処理します。への呼び出しは、JProgressBar を更新する場所publish(Integer...)
への呼び出しとして EDT に中継されprocess(List)
ます。これは、すべての Swing コンポーネントと同様に、EDT で JProgressBar のみを更新する必要があるためです。
public class MySwingWorker extends SwingWorker<Void, Integer> {
private final int qtd;
private final JProgressBar progressBar;
public MySwingWorker(JProgressBar progressBar, int qtd){
this.qtd = qtd;
this.progressBar = progressBar;
}
/* This method is called off the EDT so it doesn't block the GUI. */
@Override
protected Void doInBackground() throws Exception {
for(int i = 0; i < qtd; i++) {
/* This sends the arguments to the process(List) method
* so they can be handled on the EDT. */
publish(i + 1);
/* Do your stuff. */
doSomething();
}
return null;
}
/* This method is called on the EDT in response to a
* call to publish(Integer...) */
@Override
protected void process(List<Integer> chunks) {
progressBar.setValue(chunks.get(chunks.size() - 1));
}
}
こんな感じで起動できます
int qtd = ...;
progressBar.setMinimum(0);
progressBar.setMaximum(qtd);
SwingWorker<? ,?> worker = new MySwingWorker(progressBar, qtd);
worker.execute();