0

JInternalFrames を使用する MDI アプリケーションがあります。各内部フレームは異なる操作を行いますが、他のフレームの一部は JOptionPane を使用してメッセージを表示します。これにより、もちろんアプリケーション全体が一時停止します。

とにかく(JOptionPaneダイアログまたはその他のダイアログボックスがその問題についてはいつでも)自分の内部フレームにモーダルであることはありますか(つまり、フレームXはメッセージを表示し、自分のフレームを一時停止しますが、フレームYと残りのアプリケーションは続行できます)?

そして、コードを変更せずに (または少なくともほんの少しだけ) これを行うことは可能ですか?

4

2 に答える 2

1

ご質問の内容はわかりますが、可能かもしれませんが、簡単ではありません。モダリティは、モーダル ダイアログをポップアップした JInternalFrame に対して「ローカル」にする必要があります。

最初に、モーダル ポップアップには実際には 2 つの部分があり、独自に作成したもので近似できることを理解する必要があります。1) ポップアップが閉じるまでモーダル ポップアップ ブロックを設定するコード、および 2) モーダル ポップアップが表示されている間、「背景」は GUI イベントに応答しません。

真のモダリティは、現在の EDT をブロックし、モーダル コンポーネントの新しいイベント ポンプを作成することでこれを実現します。(java.awt.Container.#startLWModal() を参照してください) すべての JInternalFrames が 1 つの EDT を共有するため、これは機能しません。これは、Swing の動作 (単一の UI スレッド) の基本的な部分です

ただし、JInternalFrames は JRootPanes です。つまり、それらにはガラス板があります。これを使用して、独自のモダリティを作成できます。アイデアは、各 JInternalFrame のモーダル ポップアップを、JInternalFrame にインストールされる透明なガラス板の中央に表示することです。マウス イベントを消費するマウス リスナーを透明なガラス枠に追加します。これにより、モダリティ機能 #2 が得られます (背景が応答しないようです)。ブロッキングの代わりに OO を使用して、機能 1 を取得します (モーダル ポップアップに IModalPopupListener (これを作成しました - 作成する必要があります) オブジェクトを取り、モーダル ポップアップが消えたときにコールバックします)。

これが理にかなっていることを願っています!幸運を!

于 2009-09-14T16:26:15.997 に答える