JDK1.4.1のバグ

Component に add した FocusListener の focusLost メソッド内で Modal な Dialog を show するとデッドロック。ちなみに、Alt+Tab とかマウスクリックで Window を移動した場合に focusLost したときのみバグが再現。JDK1.4.2 では直ってる模様。このバグのせいで俺のプロジェクトのGUIまわりの仕様が変わるかもorz。回避方法は FocusEvent の isTemporary メソッドで Window が移動したときはダイアログを表示しないようにするか、SwingUtilities#invokeLater でダイアログを開くのを EventDispatchTread のキューに入れると直ったり。あともちろん JDK のバージョンをあげるのが最適。俺のプロジェクトでは無理だけどorz。BugParade 探してないんだけど、原因はおそらく Window オブジェクトがデッドロッキングしてると推測。


このバグがあるってことを Bugzilla にあげたら勝手に直された。そもそも Focus Lost したときにエラーチェックしてダイアログ出すかどうか仕様変わるかもとかコメントに書いておいたのに。その人には度々爆撃を浴びてる。勝手にソースをロールバックされたり。しかもVSSに権限ないから手動で。あと、コンパイルとおらないとか日常茶飯事。デグレモナー。いつかヌっコロヌ。


以下再現するコードを。


import javax.swing.*;
import java.awt.event.*;

public class test {
public test() {
final JFrame frame = new JFrame();
frame.setSize(200, 200);
JTextField field = new JTextField();

frame.getContentPane().add(field);

field.addFocusListener(
new FocusAdapter() {
public void focusLost(FocusEvent e) {
JDialog dialog = new JDialog(frame, true);
dialog.show();
}
} );
frame.show();
}

public static void main(String[] argv) {
new test();
}
}

追記:
Java のフォーカス辺りの api 見てたら 1.4 から Component に requestFocusInWindow ってメソッドが追加されてたよ。プラットフォームによっては Window 間の Focus Traverse が出来ないからだって。こっち使えってさ。1.4 って結構フォーカス周りが変わったっていうか改善されたのね。