このドキュメントは、モーダリティ関連のクラス(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"」と同じチェックが、各ウィンドウおよびダイアログに対して、最初に表示された順序で実行されます。
JDK6以降では、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から起動されたアプリケーションに関してです。
|
|
|
|
|
|
|
|