この付録では、モーダル・ウィンドウに状況依存のヘルプ・トピックを表示しようとすると問題が発生する場合、Javaでそのモーダル・ウィンドウがどのように処理されるかについて説明します。モーダル・ウィンドウとは、そのウィンドウから制御を移動できないウィンドウのことです。モーダルではないウィンドウとは、他のウィンドウに制御の切替えが可能なウィンドウのことです。
この付録の構成は、次のとおりです。
ユーザーがモーダルではないウィンドウからヘルプを要求した場合は、ヘルプ・ウィンドウと要求元ウィンドウを自由に切り替えることができます。ただし、モーダル・ウィンドウからヘルプを要求した場合は切替えを行うことができません。Javaでは、モーダル・ウィンドウは、さらに別のモーダル・ウィンドウを除いて、Java仮想マシンによって生成された他のウィンドウへのアクセスをすべてブロックします。このため、ヘルプがモーダル・ウィンドウから要求された場合、OHJはモーダルなヘルプ・ウィンドウにヘルプを表示する必要があります。OHJ自体がモーダル・ウィンドウに表示されるため、アプリケーションに戻るには、ヘルプ・ウィンドウを閉じる必要があります。
ヘルプが要求されると、OHJは、そのアクティブ・ウィンドウがモーダルかどうかを判別します。モーダルである場合は、通常のOHJトピック・ウィンドウおよびOHJナビゲータ・ウィンドウの親を、新規のモーダル・ウィンドウに変更します。新規ウィンドウはユーザーのディスプレイのフォアグラウンドに表示されるため、ユーザーは、このウィンドウと対話できます。実際に、このモーダルなヘルプ・ウィンドウを閉じる場合には対話が必要となります。Javaでのモダリティの実装は綿密ではないため、この方法が、OHJが現在サポートしているJava仮想マシンで機能する唯一の解決策です。
OHJの回避策が機能するためには、OHJは現在アクティブであるウィンドウを追跡できる必要があります。registerClientWindow()
メソッドを使用し、作成する各ウィンドウ(フレームまたはダイアログ)をHelpオブジェクトに登録します。
Help.registerClientWindow()
を使用してウィンドウ・オブジェクトを登録した場合は、これらのオブジェクトを登録解除する必要があります。ウィンドウがアクティブではなくなったと判断した場合、unregisterClientWindow()
を使用して、そのHelpオブジェクトでのウィンドウの登録を解除します。ウィンドウ・インスタンスの登録解除に失敗すると、そのウィンドウはガベージ・コレクションの対象外となることに注意してください。