質問
JFrame内にUIが構築されています。ボタンの1つは、長期にわたる呼び出し(まだ同じJavaプロセス内)を開始し、その実行中にUIは凍結されます。
私は、物事がまだ実行されていることを明確にするために、おそらくポップアップで進行状況バーを表示できるように、ユーザーがプログラムが何をしているかについて最新の状態に保つことができると考えました。
そこで、私は新しいJDialogを作成し、Jprogressbarを追加し、事態に合わせて更新しています。問題は、ダイアログのコンテンツが更新されていないことです。タイトルに変更する変更はすぐに表示され、コンソールに出力するものは何でもありませんが、UI自体には何もありません。
塗り直しを強制するために発行できるコマンドはありますか?
このセクションの中核は次のとおりです。
killWindow = new JDialog();
killWindow.setUndecorated(true);
killWindow.setTitle("stopping tests - 0 of " + numActive);
killProgress = new JProgressBar(0, numActive);
killWindow.add(killProgress);
killProgress.setStringPainted(true);
killWindow.pack();
killWindow.setLocationRelativeTo(frame);
killWindow.setVisible(true);
それから、私たちが進むにつれて...:
killProgress.setValue(++killedTests); // not seen!
killProgress.setString("Killing test on " + nickname()); // not seen!
log("Killed another test, " + killedTests + " so far"); // visible in real time
killWindow.setTitle("stopping tests - " + killedTests +
" of " + killProgress.getMaximum()); // visible in real time
何が足りないの?私はここでグーグルで検索してみましたが、実際に何も明らかに見ていませんか?
解決
別のスレッドで長い実行タスクを実行する必要があります。
UIコンポーネントの更新を担当する「AWTイベントディスパッチスレッド」と呼ばれるこのスレッドがあります。それがあなたの長い走りのタスクを実行するのに忙しいなら しない UIを更新します(ダイアログを更新しません)。
使用を検討することができます スイング性 またはa スイングワーカー.
スイングワーカーから ドキュメンテーション これがサンプルです
final JLabel label;
class MeaningOfLifeFinder extends SwingWorker<String, Object> {
@Override
public String doInBackground() {
return findTheMeaningOfLife();
}
@Override
protected void done() {
try {
label.setText(get());
} catch (Exception ignore) {
}
}
}
(new MeaningOfLifeFinder()).execute();
別のスレッドで長いタスクを実行することで、AWTイベントディスパッチスレッドがレスポンシブUIを表示できるようにします。
あなたはこれを見るかもしれません」Javaチュートリアルからのレッスン「これらの概念をよりよく理解する。
他のヒント
イベントディスパッチスレッド(EDT)で長いランニングタスクを実行しているように聞こえます。スイングワーカーを見てください。 1.6を使用している場合、それは組み込まれています:
http://java.sun.com/javase/6/docs/api/javax/swing/swingworker.html
そうでない場合は、以下の詳細情報を見つけることができます。