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