並行性とSwingに関する古典的な問題があります。問題は、メインのSwingスレッド、EDT、またはイベントディスパッチスレッドで長時間実行されるタスクを実行していることです。これにより、プロセスが完了するまでスレッドがロックされ、ユーザーとの対話やGUIグラフィックの描画。
解決策は、SwingWorkerオブジェクトによって与えられるようなバックグラウンドスレッドで長時間実行されるタスクを実行することです。次に、SwingWorkerの公開/プロセスペアを介してプログレスバーを更新できます(決定要因の場合)。詳細については、Swingでの並行性に関するこの記事をお読みください。
例えば、
public void myMethod() {
final MyProgessBarFrame progFrame = new MyProgessBarFrame();
new SwingWorker<Void, Void>() {
protected Void doInBackground() throws Exception {
// do some processing here while the progress bar is running
// .....
return null;
};
// this is called when the SwingWorker's doInBackground finishes
protected void done() {
progFrame.setVisible(false); // hide my progress bar JFrame
};
}.execute();
progFrame.setVisible(true);
}
また、これが別のSwingコンポーネントから表示されている場合は、おそらくJFrameではなくモーダルJDialogを表示する必要があります。これが、SwingWorkerコードの後にウィンドウでsetVisible(true)を呼び出した理由です。これにより、モーダルダイアログの場合、SwingWorkerの実行が妨げられることはありません。