ナビゲーション・ヘッダーをスキップ
Oracle Help for Java開発者ガイド Table of Contents
目次
Previous topic
前へ
Next topic
次へ

Javaモーダル・ウィンドウの問題点の回避方法

モーダル・ウィンドウに対して状況依存ヘルプを表示する場合、Javaによるモーダル・ウィンドウの処理の特性により問題が発生します。 (モーダル・ウィンドウは、そこから移動できないウィンドウです。 非モーダル・ウィンドウは、他のウィンドウに移動できます。)

OHJでは、この問題の回避方法が提供されています。次の各項で説明します。

Javaモーダル・ウィンドウの問題点

非モーダル・ウィンドウからヘルプを要求した場合、ヘルプ・ウィンドウと、ヘルプを要求したウィンドウを切り替えることができます(通常の動作)。しかしモーダル・ウィンドウからヘルプを要求した場合、これは不可能です。Javaでは、モーダル・ウィンドウから、Java Virtual Machineで作成された他のウィンドウにはアクセスできません(他のモーダル・ウィンドウへのアクセスは可能です)。そのため、モーダル・ウィンドウからヘルプを要求する場合、OHJではモーダルのヘルプ・ウィンドウでヘルプを表示する必要があります。OHJそのものがモーダル・ウィンドウであるため、アプリケーションに戻るとき、ユーザーはヘルプ・ウィンドウを閉じる必要があります。

ヘルプが要求されると、OHJはアクティブ・ウィンドウがモーダルであるかどうかを判断します。アクティブ・ウィンドウがモーダルである場合、OHJは通常のトピック・ウィンドウの親子関係を変更し、ナビゲータ・ウィンドウを新規のモーダル・ウィンドウにします。この新規ウィンドウは、画面の前面に表示されるため、ユーザーはこのウィンドウを操作できます。実際には、このウィンドウを操作するのは、ヘルプ・ウィンドウ(モーダル)を閉じるときのみです。Javaにおけるモダリティの実装は不十分なため、これがOHJでサポートされているすべてのJava Virtual Machineで有効な唯一の解決方法です。

ウィンドウの登録

OHJでの回避方法が機能するためには、OHJによって現在アクティブなウィンドウが追跡できるようにする必要があります。 registerClientWindow()メソッドを使用して、作成するすべてのウィンドウ(FrameまたはDialog)をHelpオブジェクトに登録します。

registerClientWindow()メソッド
registerClientWindow(Window aWindow)

Helpオブジェクトに登録されたWindowインスタンスを追跡します。アクティブ・ウィンドウがモーダル・ダイアログであり、そこからヘルプを要求した場合、Helpオブジェクトは、ヘルプ・ウィンドウがアクティブなモーダル・ダイアログにブロックされないように特別な動作をします。

パラメータ:

aWindow - 登録するWindowインスタンス。

詳細は、 APIのドキュメントHelp.registerClientWindow()を参照してください。

ウィンドウの登録解除

Help.registerClientWindow()を使用してWindowオブジェクトを登録した場合、登録解除もする必要があります。ウィンドウがアクティブでないことがわかっている場合、unregisterClientWindow()メソッドを使用して、そのウィンドウをHelpオブジェクトから登録解除する必要があります。Windowインスタンスを登録解除しないと、そのウィンドウはガベージ・コレクションの対象にならないので注意してください。

unregisterClientWindow()メソッド
unregisterClientWindow(Window aWindow)

ウィンドウがアクティブでなくなった場合、クライアントは、registerClientWindow()メソッドを使用して登録されたすべてのWindowインスタンスを登録解除する必要があります。Windowインスタンスを登録解除しないと、そのウィンドウはガベージ・コレクションの対象になりません。

パラメータ:

aWindow - 登録解除するWindowインスタンス。

詳細は、 APIのドキュメントHelp.unregisterClientWindow()を参照してください。