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