このドキュメントは、モーダリティー関連のクラス (java.awt.Dialog
など) の API ドキュメントと合わせて、新しいモーダリティー機能およびその使用方法について簡単に説明します。次のセクションがあります。
ドキュメント - 所有者がなく、そのすべての子の階層とともに、自己完結型の単一のドキュメントとして操作できるウィンドウ。各ウィンドウは何らかのドキュメントに属しており、そのルートは、所有者のないもっとも近い上位ウィンドウとして見つけることができます。
警告! 一部のウィンドウマネージャーでは、ユーザーがウィンドウの Z 軸順を任意に変更できます。この場合、最後の要件が満たされない場合があります。
モーダルダイアログ - 表示されている間、何らかのウィンドウをブロックするダイアログ。ブロックされるウィンドウは、ダイアログのブロックの範囲に従って決定されます。
モーダル除外ウィンドウ - モーダルダイアログが表示されている間、ブロックされないウィンドウ。ウィンドウがモーダル除外の場合、そのウィンドウが所有するすべてのウィンドウと子コンポーネントも除外されます。
ブロックの範囲 (SB) - モーダルダイアログが表示されている間、そのダイアログによってブロックされるウィンドウ (java.awt.Window
およびそのすべての派生クラスのインスタンス) のセット。
注:このドキュメントを通して、「ウィンドウ」の概念は Java プログラミング言語のトップレベルウィンドウ、つまりjava.awt.Window
またはその派生クラスのインスタンスと同等です。
サポートされるモーダリティーは 4 つのタイプがあります。
モーダリティーの優先度は、モードなし、ドキュメントモーダル、アプリケーションモーダル、およびツールキットモーダルというブロッキングの強さの順になります。この順序は、2 つのダイアログが可視でお互いをブロックする場合に、どちらがブロックされないかを決定するときに使用されます。当然、ダイアログのブロックの範囲 (SB) のネストが反映されます。モードなしダイアログの SB は空で、ドキュメントモーダルダイアログの SB は一部のアプリケーションでは完全、また、すべてのアプリケーションは 1 つのツールキット内で実行されます。
所有者に関する注意:
Dialog
は Window
から派生するクラスであるため、Dialog
のインスタンスは、所有者がない場合は自動的にドキュメントのルートになります。したがって、このようなダイアログがドキュメントモーダルである場合、ブロックの範囲は空で、モードなしのダイアログと同様に動作します。
実装上の注意:可視ダイアログのモーダリティータイプを変更しても、いったん非表示にしてから再度表示するまで、変更が反映されないことがあります。
ウィンドウまたはモードなしダイアログの表示:"F"
すべての可視モーダルダイアログが調べられます。F がそのうちのいずれかの SB にある場合、F はそれによってブロックされます。このようなダイアログがいくつか存在する場合は、最初に表示されたものが使用されます。このようなダイアログが存在しない場合は、F がブロック解除されたままになります。
モーダルダイアログの表示:"M"
モーダルダイアログ M が表示されるとすべての可視ウィンドウは次の 3 つの別個のグループのいずれかに属します。
モーダルダイアログ M の表示後、最初のグループで最初に表示されるダイアログ (ある場合) によってブロックされます。2 番目のグループのすべてのウィンドウは M によってブロックされ、3 番目のグループのすべてのウィンドウは変化しません。
通常の場合、子ダイアログがその所有者より前に表示されない場合は、このルールは単純化できます。(次の単純化されたケースでは詳細が省略されている場合があります)。
ドキュメントモーダルダイアログの表示:"M"
すべての可視のアプリケーションモーダルおよびツールキットモーダルのダイアログが調べられます。M がそのうちのいずれかの SB にある場合、M はそれによってブロックされます。このようなダイアログがいくつか存在する場合は、最初に表示されたものが使用されます。このようなダイアログが存在しない場合は、M がブロック解除されたままになります。
アプリケーションモーダルダイアログの表示:"M"
すべての可視ツールキットモーダルダイアログが調べられます。M がそのうちのいずれかの SB にある場合、M はそれによってブロックされます。このようなダイアログがいくつか存在する場合は、最初に表示されたものが使用されます。このようなダイアログが存在しない場合は、M がブロック解除されたままになります。
ツールキットモーダルダイアログの表示:"M"
M はブロックされません。
現在/表示 | フレーム & モードなし | ドキュメント | アプリケーション | ツールキット |
- | - | - | - | - |
ドキュメント | ブロック | - | - | - |
アプリケーション | ブロック | ブロック | - | - |
ツールキット | ブロック | ブロック | ブロック | - |
モーダルダイアログが表示されると、このモーダルダイアログをブロックするウィンドウを除き、SB に含まれるすべてのウィンドウがブロックされます。
ウィンドウまたはモードなしダイアログの非表示:"F"
F がモーダルダイアログ M によってブロックされていた場合、ブロック解除され M のブロックされたウィンドウのリストから削除されます。
モーダルダイアログの非表示:"M"
M がほかのモーダルダイアログ (たとえば "N") によってブロックされていた場合、ブロック解除され N のブロックされたウィンドウのリストから削除されます。次に、M によってブロックされていたすべてのウィンドウおよびダイアログがブロック解除され、その後、「モーダルダイアログの表示: "M"」と同じチェックが、各ウィンドウおよびダイアログに対して、最初に表示された順序で実行されます。
JDK 6 以降は、2 つのモーダル除外タイプが導入されています
実装上の注意:可視ウィンドウのモーダル除外タイプを変更しても、いったん非表示にしてから再度表示するまで、変更が反映されないことがあります。
最前面
最前面でないモーダルダイアログが最前面ウィンドウをブロックする場合、それらの相対的な Z 軸順は未定義でプラットフォームに依存します。
toFront()
および toBack()
メソッド
モーダルダイアログは、そのすべてのブロックされたウィンドウより常に前面に表示されるようにします。したがって、ブロックされたウィンドウが前面に移動されると、ブロックしているダイアログがある場合はそれも前面に移動され、ブロックされたウィンドウの前の位置を保ちます。同様に、モーダルダイアログが背面に移動された場合、それによってブロックされたすべてのウィンドウも背面に移動され、ブロックしているダイアログの下の位置を保ちます。
ブロックされたウィンドウの最小化、最大化、およびクローズ
モーダルダイアログがウィンドウをブロックしている場合、ユーザーはブロックされたウィンドウを最大化および最小化できない場合があります。ただし、実際の動作は未定義でプラットフォームに依存します。いずれの場合も、ユーザーはブロックされたウィンドウを対話型で閉じることはできませんが、ブロックされたウィンドウの setVisible(false)
または dispose()
メソッドを呼び出すことによってプログラム的に閉じることはできます。
ブロックされたウィンドウのアクティブ化
ユーザーがブロックされたウィンドウを選択すると、ブロックしているモーダルダイアログとともに前面に移動され、モーダルダイアログがアクティブウィンドウになる場合があります。ただし、実際の動作は未定義でプラットフォームに依存します。
モーダルダイアログの非表示
現在フォーカスを取得しているモーダルダイアログが非表示になった場合、ほかのどのウィンドウがアクティブウィンドウになるかは未定義でプラットフォームに依存します。次のものがアクティブウィンドウになる可能性があります。
Window
(モーダルダイアログの所有者がないかブロックされている場合)。
ツールキットモーダルダイアログを表示するには、特殊な AWTPermission
である "toolkitModality"
が必要です。これにより、たとえばアプレットから表示されるモーダルダイアログによってブラウザまたは Java Web Start (JWS) がブロックされるのを防ぎます。
ウィンドウをツールキットモーダリティーから除外するためにも同じアクセス権が必要です。これにより、たとえばアプレットから表示されるダイアログがブラウザまたは JWS のモーダルダイアログによってブロックされるのを防ぎます。
2 つの java.awt.Toolkit
メソッドにより、現在のプラットフォームが特定のモーダリティー機能をサポートするかどうかをチェックできます。
isModalityTypeSupported(modalityType)
isModalExclusionTypeSupported(modalExclusionType)
デフォルトのモーダリティータイプはアプリケーションモーダルです。Dialog.setModal(true)
、Dialog(owner, true)
、などの API 呼び出しによって使用されます。JDK 6 より前では、デフォルトタイプはツールキットモーダルでしたが、アプリケーションモーダリティーとツールキットモーダリティーの唯一の違いはアプレットと Java Web Start から起動されたアプリケーションに関してです。
|
|
|
|
|
|
|
|