答えを見つけようとしているデザイン関連の質問があります。
これがシナリオです。
ユーザー入力の結果として、コストのかかる (時間がかかる) 何かをしたいとします (たとえば、データベースから大量のデータをロードする、大きなファイルを読み取るなど)。強く推奨される方法は、時間のかかる作業を別のスレッドで実行し、決して EDT をブロックしないことです。そうしないと、GUI が応答しなくなります。
ただし、バックグラウンド タスクが終了しない限り、GUI に入力を提供してはならないシナリオがあります。私の特定のケースでは、バックグラウンド作業が終了した後にのみ、どの GUI 要素を表示して有効/無効にするかを決定できます。表示して有効にする必要がある GUI 要素のみがユーザー入力に応答する必要があります。そうしないと、私の特定のケースでは動作が予測できない場合があります。
これは、そのようなシナリオを処理するために私が行っていることです。
ステップ 1: 時間のかかる操作を開始する前に。
- カーソルをビジー カーソルに変更します。
- コンポーネントの最上位フレームのガラス枠にマウス リスナーを追加します。
- マウス イベントを受信できるように、グラスペインを表示します。ガラス板は、マウス入力の結果として何もしません。
ステップ 2: 時間のかかる操作をバックグラウンド スレッドで実行します。バックグラウンド スレッドには、ジョブが終了したとき (完了またはエラーにより中止されたとき) にイベント スレッドに通知する finally ブロックがあります。
ステップ 3:
- マウスカーソルを通常に戻します。
- ガラス ペインからリスナーを削除します。
- グラスペインを非表示にして、マウス イベントが意図した受信者に送信されるようにします。
これは、そのような状況を処理するための正しいアプローチですか?
皆さんは何をお勧めしますか?