argius note

プログラミング関連

JOptionPane.showInputDialogでキャンセルしたのに

JOptionPane.showInputDialogは、キャンセルすると普通はnullが返されます。
ところが、リストをダブルクリックしてキャンセルすると、なぜか値が選択されたことになってしまいます。


正確には、入力をJList形式(Object[]で良い)でプルダウンでなくリスト状態(件数が20を超えるとなる?)になっているところでlistの要素をダブルクリックし、それからキャンセルしてもダブルクリックした要素の値が返されてしまいます。
以下が再現プログラムです。適当なクラスを作って貼り付けてください。importは適当に補ってください。

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            Object[] a = {1, 2, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,};
            Object value = JOptionPane.showInputDialog(null,
                                                       null,
                                                       null,
                                                       JOptionPane.PLAIN_MESSAGE,
                                                       null,
                                                       a,
                                                       a[0]);
            System.out.println(value); // => 3
        }
    });
}

これを実行すると、リスト選択ダイアログが表示されます。
"3"をダブルクリックしてからキャンセルボタンを押すと、なぜか"3"が選択されたことになってしまいます。


これはどうやらバグのようです。Java7-b03で修正されたらしいですが、確認はしていません。