3

答えを見つけようとしているデザイン関連の質問があります。

これがシナリオです。

ユーザー入力の結果として、コストのかかる (時間がかかる) 何かをしたいとします (たとえば、データベースから大量のデータをロードする、大きなファイルを読み取るなど)。強く推奨される方法は、時間のかかる作業を別のスレッドで実行し、決して EDT をブロックしないことです。そうしないと、GUI が応答しなくなります。

ただし、バックグラウンド タスクが終了しない限り、GUI に入力を提供してはならないシナリオがあります。私の特定のケースでは、バックグラウンド作業が終了した後にのみ、どの GUI 要素を表示して有効/無効にするかを決定できます。表示して有効にする必要がある GUI 要素のみがユーザー入力に応答する必要があります。そうしないと、私の特定のケースでは動作が予測できない場合があります。

これは、そのようなシナリオを処理するために私が行っていることです。

ステップ 1: 時間のかかる操作を開始する前に。

  1. カーソルをビジー カーソルに変更します。
  2. コンポーネントの最上位フレームのガラス枠にマウス リスナーを追加します。
  3. マウス イベントを受信できるように、グラスペインを表示します。ガラス板は、マウス入力の結果として何もしません。

ステップ 2: 時間のかかる操作をバックグラウンド スレッドで実行します。バックグラウンド スレッドには、ジョブが終了したとき (完了またはエラーにより中止されたとき) にイベント スレッドに通知する finally ブロックがあります。

ステップ 3:

  1. マウスカーソルを通常に戻します。
  2. ガラス ペインからリスナーを削除します。
  3. グラスペインを非表示にして、マウス イベントが意図した受信者に送信されるようにします。

これは、そのような状況を処理するための正しいアプローチですか?

皆さんは何をお勧めしますか?

4

1 に答える 1

5

SwingWorkerこのコンテキストで使用できます。バックグラウンド タスクが開始され、 で再び有効になると、関連するコントロールを無効にすることができますdone()。この関連するでは、runボタンは「実行」と「キャンセル」を切り替えるように条件付けられています。

補遺: Java 1.5 へのバックポートは、こちらから入手できます。

于 2011-05-20T17:49:26.150 に答える