AWTのモーダリティ

このドキュメントは、モーダリティ関連のクラス(java.awt.Dialogなど)のAPIドキュメントと合わせて、新しいモーダリティ機能およびその使用方法について簡単に説明します。次のセクションがあります。

定義

ドキュメント - 所有者がなく、そのすべての子の階層とともに、自己完結型の単一のドキュメントとして操作できるウィンドウ。各ウィンドウは何らかのドキュメントに属しており、そのルートは、所有者のないもっとも近い上位ウィンドウとして見つけることができます。

モーダル・ブロック・ウィンドウ - 次のようなウィンドウ:


警告: 一部のウィンドウ・マネージャでは、ユーザーがウィンドウのZ軸順を任意に変更できます。この場合、最後の要件が満たされない場合があります。

モーダル・ダイアログ - 表示されている間、何らかのウィンドウをブロックするダイアログ。ブロックされるウィンドウは、ダイアログのブロックの範囲に従って決定されます。

モーダル除外ウィンドウ - モーダル・ダイアログが表示されている間、ブロックされないウィンドウ。ウィンドウがモーダル除外の場合、そのウィンドウが所有するすべてのウィンドウと子コンポーネントも除外されます。

ブロックの範囲(SB) - モーダル・ダイアログが表示されている間、そのダイアログによってブロックされるウィンドウ(java.awt.Windowおよびそのすべての派生クラスのインスタンス)のセット。


: このドキュメントを通して、「ウィンドウ」の概念はJavaプログラミング言語のトップレベル・ウィンドウ、つまりjava.awt.Windowまたはその派生クラスのインスタンスと同等です。

モーダリティ・タイプ

サポートされるモーダリティには4つのタイプがあります。

ダイアログはデフォルトでモードなしです。モーダル・ダイアログはデフォルトでアプリケーション・モーダルです。

  1. モードなしダイアログ
    モードなしダイアログは、表示されている間、他のウィンドウをブロックしません。
  2. ドキュメント・モーダル・ダイアログ
    ドキュメント・モーダル・ダイアログは、自身の子階層のウィンドウを除く、同じドキュメント内のすべてのウィンドウをブロックします。ドキュメントのルートは、所有者のないもっとも近い上位ウィンドウとして判別されます。
  3. アプリケーション・モーダル・ダイアログ
    アプリケーション・モーダル・ダイアログは、自身の子階層のウィンドウを除く、同じアプリケーション内のすべてのウィンドウをブロックします。ブラウザでいくつかのアプレットが起動されている場合、これらは個別のアプリケーションまたは単一のアプリケーションとして扱われる場合があります。この動作は実装に依存します。
  4. ツールキット・モーダル・ダイアログ
    ツールキット・モーダル・ダイアログは、自身の子階層のウィンドウを除く、同じツールキット内で実行されるすべてのウィンドウをブロックします。いくつかのアプレットが起動されている場合、これらはすべて同じツールキットで実行されます。したがって、あるアプレットから表示されたツールキット・モーダル・ダイアログは、ほかのアプレットと、このツールキットのJava実行環境が組み込まれたブラウザ・インスタンスのすべてのウィンドウに影響を与える可能性があります。次の「セキュリティ」セクションを参照してください。

モーダリティの優先度は、モードなし、ドキュメント・モーダル、アプリケーション・モーダルおよびツールキット・モーダルというブロッキングの強さの順になります。この順序は、2つのダイアログが可視でお互いをブロックする場合に、どちらがブロックされないかを決定するときに使用されます。当然、ダイアログのブロックの範囲(SB)のネストが反映されます。モードなしダイアログのSBは空で、ドキュメント・モーダル・ダイアログのSBは一部のアプリケーションでは完全、また、すべてのアプリケーションは1つのツールキット内で実行されます。

所有者に関する注意:


実装上の注意:可視ダイアログのモーダリティ・タイプを変更しても、いったん非表示にしてから再度表示するまで、変更が反映されないことがあります。

ブロックの表示/非表示

ウィンドウまたはモードなしダイアログの表示:"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つのモーダル除外タイプが導入されています

デフォルトでは、ウィンドウのモーダル除外プロパティはオフになっています。

  1. アプリケーション・モーダル除外
    ウィンドウがアプリケーション・モーダル除外である場合は、アプリケーション・モーダル・ダイアログによってブロックされません。また、子階層の外部からドキュメント・モーダル・ダイアログでブロックされることもありません。
  2. ツールキット・モーダル除外
    ウィンドウがツールキット・モーダル除外である場合は、アプリケーション・モーダルまたはツールキット・モーダルのダイアログによってブロックされません。また、ドキュメント・モーダル・ダイアログによってその子階層の外部からブロックされることもありません。


実装上の注意:可視ウィンドウのモーダル除外タイプを変更しても、いったん非表示にしてから再度表示するまで、変更が反映されないことがあります。

関連するAWT機能

最前面
最前面でないモーダル・ダイアログが最前面ウィンドウをブロックする場合、それらの相対的なZ軸順は未定義でプラットフォームに依存します。

toFront()およびtoBack()メソッド
モーダル・ダイアログは、そのすべてのブロックされたウィンドウより常に前面に表示されるようにします。したがって、ブロックされたウィンドウが前面に移動されると、ブロックしているダイアログがある場合はそれも前面に移動され、ブロックされたウィンドウの前の位置を保ちます。同様に、モーダル・ダイアログが背面に移動された場合、それによってブロックされたすべてのウィンドウも背面に移動され、ブロックしているダイアログの下の位置を保ちます。

ブロックされたウィンドウの最小化、最大化、およびクローズ
モーダル・ダイアログがウィンドウをブロックしている場合、ユーザーはブロックされたウィンドウを最大化および最小化できない場合があります。ただし、実際の動作は未定義でプラットフォームに依存します。いずれの場合も、ユーザーはブロックされたウィンドウを対話型で閉じることはできませんが、ブロックされたウィンドウのsetVisible(false)またはdispose()メソッドを呼び出すことによってプログラム的に閉じることはできます。

ブロックされたウィンドウのアクティブ化
ユーザーがブロックされたウィンドウを選択すると、ブロックしているモーダル・ダイアログとともに前面に移動され、モーダル・ダイアログがアクティブ・ウィンドウになる場合があります。ただし、実際の動作は未定義でプラットフォームに依存します。

モーダル・ダイアログの非表示
現在フォーカスを取得しているモーダル・ダイアログが非表示になった場合、ほかのどのウィンドウがアクティブ・ウィンドウになるかは未定義でプラットフォームに依存します。次のものがアクティブ・ウィンドウになる可能性があります。

  1. モーダル・ダイアログの所有者(所有者がブロックされていない場合)。
  2. このモーダル・ダイアログがフォーカスを取得する前にアクティブだったWindow(モーダル・ダイアログの所有者が存在しないか、ブロックされている場合)。
非表示にされるモーダル・ダイアログがフォーカスを取得していない場合、アクティブ・ウィンドウは変更されません。

セキュリティ

ツールキット・モーダル・ダイアログを表示するには、特殊なAWTPermissionである"toolkitModality"が必要です。これにより、たとえばアプレットから表示されるモーダル・ダイアログによってブラウザまたはJava Web Start (JWS)がブロックされるのを防ぎます。

ウィンドウをツールキット・モーダリティから除外するためにも同じアクセス権が必要です。これにより、たとえばアプレットから表示されるダイアログがブラウザまたはJWSのモーダル・ダイアログによってブロックされるのを防ぎます。

プラットフォームのサポート

2つのjava.awt.Toolkitメソッドにより、現在のプラットフォームが特定のモーダリティ機能をサポートするかどうかをチェックできます。

互換性

デフォルトのモーダリティ・タイプはアプリケーション・モーダルです。Dialog.setModal(true)Dialog(owner, true)などのAPI呼出しによって使用されます。JDK 6より前では、デフォルト・タイプはツールキット・モーダルでしたが、アプリケーション・モーダリティとツールキット・モーダリティの唯一の違いはアプレットとJava Web Startから起動されたアプリケーションに関してです。

  1. フレーム「F」が表示される
  2. ドキュメント・モーダル・ダイアログ「Di」が表示される
  3. FがDiによってブロックされる - 同じドキュメント内に存在する
  4. ドキュメント・モーダル・ダイアログ「Dii」が表示される
  5. DiがDiiによってブロックされる - 同じドキュメント内に存在する


  1. フレーム「F」が表示される
  2. ドキュメント・モーダル・ダイアログ「Di」が表示される
  3. FがDiによってブロックされる - 同じドキュメント内に存在する
  4. ドキュメント・モーダル・ダイアログ「Dii」が表示される
  5. DiがDiiによってブロックされる - 同じドキュメント内に存在する
  6. Diが非表示になる
  7. FがDiiによってブロックされる - 同じドキュメント内に存在する


  1. フレーム「F」が表示される
  2. ツールキット・モーダル・ダイアログ「Di」が作成されるが、表示されない
  3. ドキュメント・モーダル・ダイアログ「Dii」が表示される
  4. FがDiiによってブロックされる - 同じドキュメント内に存在する
  5. アプリケーション・モーダル・ダイアログ「Diii」が表示される
  6. DiiがDiiiによってブロックされる - 同じアプリケーション内に存在する
  7. Diが表示される
  8. DiがDiiによってブロックされる - 前者は後者の所有者
  9. Diiiはブロックされない - Diiをブロックし、DiiはDiをブロックする


  1. フレーム「F」が表示される
  2. ツールキット・モーダル・ダイアログ「Di」が作成されるが、表示されない
  3. ドキュメント・モーダル・ダイアログ「Dii」が表示される
  4. FがDiiによってブロックされる - 同じドキュメント内に存在する
  5. アプリケーション・モーダル・ダイアログ「Diii」が表示される
  6. DiiがDiiiによってブロックされる - 同じアプリケーション内に存在する
  7. Diが表示される
  8. DiiiがDiによってブロックされる - Diはブロックされない
  9. Diはブロックされない