Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

JOptionPaneのフォーカスについて

あるボタンを押下すると、ファイル名を入力するダイアログを表示する処理を下記の様にJOptionPaneクラスを使用して行っています。
Java5(1.5.0_11-b03)では、ファイル名を入力するテキストフィールド(text)にフォーカスが当たっていたのですが、Java6(1.6.0_05-b13)にしたら、[了解]ボタンにフォーカスが当たるようになってしまいました。
Java6で、テキストフィールド(text)にフォーカスが当たるようにしたいのですが、どのようにしたらいいのか分かりません。分かる方、ご教授ください。

尚、コンパイルは、JBuilder2006(SP3)で行っており、OSは、Windows2000(SP4)を使用しています。

---以下、ソース--------------------------
JPanel panel = new JPanel();
JLabel lbl = new JLabel();
JTextField text = new JTextField();

panel.setLayout(new BorderLayout());
lbl.setText("File Name:");
text.addFocusListener(new FocusAdapter(){
  public void focusLost(FocusEvent e) {
    System.out.println("Focus Lost");
  }
  public void focusGained(FocusEvent e){
    System.out.println("Focus Gaine");
  }
});
text.setColumns(15);
panel.add(lbl,BorderLayout.WEST);
panel.add(text,BorderLayout.CENTER);
JOptionPane pane = new JOptionPane(panel, 
               JOptionPane.QUESTION_MESSAGE, 
               JOptionPane.OK_CANCEL_OPTION,
               null, null, null);
JDialog dialog = pane.createDialog(this,
                 "ファイル名を入力して下さい。");
dialog.setVisible(true);

6

回答

9638

閲覧

6件の回答

評価

0

書き忘れましたが、このソースを実行すると、
dialog.setVisible(true);の後に、下記のようにprint文が出力されます。
Java6の場合は、最後にFocusGainに来ないようです。
・Java5の場合
 Focus Gaine
 Focus Lost
 Focus Gaine
・Java6の場合
 Focus Gaine
 Focus Lost

評価

0

なるほどJava6でどこか変わったんでしょうねたぶん。

こんなんじゃダメなんでしょうね?
String inputValue = JOptionPane.showInputDialog(null,"ファイル名を入力して下さい。");
System.out.println(inputValue);
ちゃんと入力フィールドにフォーカスします。

評価

0

回答ありがとうございます。
ダイアログ内に表示する入力フィールドやラベルなどは、自分で生成したもので表示させたいので、showInputDialogは、使えません。(showInputDialogだと、JOptionPane内で自動的に生成した入力フィールドを表示するようなので)

色々調べて、一応、自己解決しました。
あまり良いやり方じゃないかもしれませんが、
↓の過去ログを参考に、WindowListenerを追加して、ダイアログが最初に表示された時(windowOpened)に、テキストフィールドにフォーカスを当てるようにしました。
http://www.javaroad.jp/bbs/answer.jsp?q_id=20070515105454586

もし、もっといいやり方があれば、ご教授ください。

評価

0

Java 5でも6でも結果は同じで、テキストフィールドにフォーカスがない状態でダイアログがオープンします(5は、1.5.0_09と1.5.0_13の両方, Linux/GNOME上でトライ)。

私の結論は、JOptionPaneは(事前に決められている部分が多い)コンビニ・コンポーネントだから、自由に自前のダイアログを作りたいときには使うべきでない、です。JOptionPaneは、showXxx()メソッドから、単純に、コンビニ的に使うべきです。その点では、たいへん良くできたコンポーネントだと思います。

評価

0

回答ありがとうございます。
Linuxだと、テキストフィールドにフォーカスがない状態でダイアログがオープンするんですね。
OSによって、動きが違うということなんですかね・・・。

確かに、JOptionPaneは、自由に自前のダイアログを作りたいときには使うべきでないかもしれません。
しかし、すでにJOptionPaneで上記のように自前のダイアログを作っているソースがたくさんあり、Java5からJava6にするのに、自前のダイアログを1から作成し直すのは、手間な為、このような質問をしました。

showXxx()メソッドから、単純に、コンビニ的に使うべきなら、JOptionPaneのコンストラクタは、publicにしなければいいのに・・・と思いますが。

評価

0

> showXxx()メソッドから、単純に、コンビニ的
> に使うべきなら、JOptionPaneのコンストラク
> タは、publicにしなければいいのに・・・と
> 思いますが。
いやいや、そういうことじゃなくて、JOPのダイアログのインスタンスを持ち運びしたいときには、showXxx()メソッドからではインスタンスが得られないからですよ。プログラマに自由なダイアログを作らせるためではありません(それなら、最初からJDialogを使うべき)。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。