Developer'sWorks
Tips

Dialog2回以上表示時の不具合を回避する方法

Swingのイベント中にダイアログを2回以上表示表示する処理を入れると、キャレットが2つになる 不具合があります。(Sun BugParade ID=4381959)
これは、フォーカス移動を伴うイベント中にダイアログを2回以上使用すると発生するのを 確認しています。この不具合が発生するとフォーカス制御がうまくいかなくなり、Afterイベントが 発生しなくなったり、Tabにてフォーカスが正常に遷移しなくなるなどの現象が発生します。
この不具合を回避するため、Javaクライアントエンジンでは回避できるように色々処理を 加えていますが、全てを回避できてはいません。

この問題を回避するためのポイントは、「フォーカス移動が絡む処理を入れ子にしない」事です。
ダイアログは、閉じる際に元画面にフォーカスを戻そうとする事によりフォーカス移動が発生しています。 そのため、Swingの処理を待ってからダイアログ表示処理を行うことにより処理の入れ子を防ぐ事ができ、不具合も 発生するのを回避する事が可能です。
Swingの処理を待つ方法の1つが、SwingUtilities.invokeLaterを使いSwingのイベントキューの最後に処理を 予約するものになります。
この方法の特性上、YesNoダイアログなど戻り値を判断して後の処理を続けることはできません。つまり、 使用が可能なダイアログは、戻り値を判断しない、閉じるボタン1つのみの確認ダイアログ、エラーダイアログに なります。
これらのダイアログをSwingUtilities.invokeLater処理したビジネスルールのサンプルが以下になります。
エラーダイアログ表示 : ShowErrorDialogWait.java :3KB
メッセージダイアログ表示 : ShowMessageDialogWait.java :3KB
YesNoダイアログを2回以上使用する場合には、今回の回避方法は使用できませんので仕様を変更して 回避してください。
現在把握している不具合発生する設定としては以下の処理を一連のイベント中に使用した場合ですが、その他にも フォーカスを絡む設定をされた場合にはこの不具合が発生する可能性があります。
  1. ダイアログ2回以上使用 + 画面を閉じる処理を使用
  2. Beforeのタイミングでダイアログ2回以上使用 + 自分をEnable=falseにする
また、この不具合はJDK1.4では修正されているため製品がJDK1.4対応版になった時点で解消されます。
-- 2003/07/22 Update