2

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

私は何が欠けていますか?ここSOでグーグルと検索を試みましたが、明らかなものは何も見られませんでしたか?

4

2 に答える 2

4

長時間実行されるタスクを別のスレッドで実行する必要があります。

UI コンポーネントの更新を担当する「AWT イベント ディスパッチ スレッド」というスレッドがあります。長時間実行されるタスクの実行でビジー状態の場合、UI は更新されません(ダイアログも更新されません)。

SwingUtilitiesまたはSwingWorkerの使用を検討してください。

SwingWorkerのドキュメントから、ここにサンプルがあります

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 チュートリアルからのレッスン」を参照してください。

于 2009-09-24T21:27:45.223 に答える
1

イベント ディスパッチ スレッド (EDT) で実行時間の長いタスクを実行しているようです。SwingWorker を見てください。1.6 を使用している場合は、次のように組み込まれています。

http://java.sun.com/javase/6/docs/api/javax/swing/SwingWorker.html

そうでない場合は、次の場所で詳細を確認できます。

http://en.wikipedia.org/wiki/SwingWorker

于 2009-09-24T21:31:19.910 に答える