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"」と同じチェックが、各ウィンドウおよびダイアログに対して、最初に表示された順序で実行されます。

モーダル除外

JDK 6 以降は、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 によってブロックされる - 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 はブロックされない