- PR -

JTextFieldのselectAllメソッドの動作について

1
投稿者投稿内容
matu
ベテラン
会議室デビュー日: 2002/09/01
投稿数: 95
お住まい・勤務地: 東京
投稿日時: 2004-04-21 10:57
 
 こんにちは。
 swingの初心者でフォーカス周りの動作でどうしてもわからない現象
があります。お気づきの点がありましたらご教授ください。

 JTextFieldが入力状態になった際に、現在の既存値を選択状態にした
いと思っていますが、focusGainedイベント処理時にselectAllメソッド
を発行すると、最初の1回目のみ既存値が選択状態になるのですがその後
TABキーなどで移動して再度SHIFT+TABキーで戻った場合、選択状態にな
りません。デバッグプリントは出力されたのでイベントは勿論処理されて
います。

public void focusGained(FocusEvent arg0) {
// System.out.println("gainPerformed()");
((JTextField) arg0.getSource()).selectAll();
}

 少し気になる点は
・arg0.getSourceのインスタンスは実際はJFormattedTextFieldである
・JFrameに対してFocusTraversalPolicyを使用しておりTextFieldもそ
 のPolicyに参加している
 この内容がフォーカス時の選択状態に影響を与えるという気はしない
のですが、何かお気づきの点がありましたらよろしくお願いいたします。

Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2004-04-22 00:35
matuさん、こんにちは。

正確には思い出せないのですが、私も何度か似たような現象を
起こした記憶があります。

そのときは確か、focusGained()でせっかく処理したものを、
その直ぐ後で focusLost()で変化させていました。

フォーカスが移動するとき、まずそれまでフォーカスがあった
コンポーネントに focusLost()が通知され、次に新しく
フォーカスが当たるコンポーネントに focusGained()が
通知させるという前提で設計して居りましたが、そうではない
場合もあったようです。(自信ありませんが。)

JComponentの DebugGraphicsOptions機能を使えば、何か
分かるかもしれません。
matu
ベテラン
会議室デビュー日: 2002/09/01
投稿数: 95
お住まい・勤務地: 東京
投稿日時: 2004-04-29 20:12
 
 Kissingerさんお返事遅くなりまして申し訳ございません。

引用:

そのときは確か、focusGained()でせっかく処理したものを、
その直ぐ後で focusLost()で変化させていました。

JComponentの DebugGraphicsOptions機能を使えば、何か
分かるかもしれません。



 Kissingerさんにご教授いただいた通りの現象でした。確か
にGainedした直後にLostしている様です!?Lostしているの
ですが実際にフォーカスはLostを発行したコンポ−ネントです。
 なんでこんな動作になるのか見当がつきません

 DebugGraphicsOptionsは初めて聞くのですがどの様に使用
するのでしょうか?

 もしかしてイベントの初歩的な事なのですが以下の様な書き方
はNGでしょうか?
public class JavaBeanA extends JPanel implements FocusListener{
private JFormattedTextField XXX = null;
private JFormattedTextField YYY = null;
public JavaBeanA (
XXX = new JFormattedTextField(フォーマッタ);
XXX.setFocusLostBehavior(JFormattedTextField.COMMIT_OR_REVERT);
XXX.addFocusListener(this);
YYY = new JFormattedTextField(フォーマッタ);
YYY.setFocusLostBehavior(JFormattedTextField.COMMIT_OR_REVERT);
YYY.addFocusListener(this);
}
public void focusGained(FocusEvent arg0) {
System.out.println("gainPerformed()");
((JTextField) arg0.getSource()).selectAll();
}
public void focusLost(FocusEvent arg0) {
System.out.println("lostPerformed()");
}
}
 この様に書きましたがフォーカスを新規に取得したコンポーネント
が以下の様にデバッグプリントしてしまします。
gainPerformed()
lostPerformed()
 つまりフォーカスを取得した直後にすぐlostしています。

 どなたか同様の現象について何かお気づきの点がありましたら
ご教授ください。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2004-04-30 15:53
unibon です。こんにちわ。

引用:

matuさんの書き込み (2004-04-21 10:57) より:
 JTextFieldが入力状態になった際に、現在の既存値を選択状態にした
いと思っていますが、focusGainedイベント処理時にselectAllメソッド
を発行すると、最初の1回目のみ既存値が選択状態になるのですがその後
TABキーなどで移動して再度SHIFT+TABキーで戻った場合、選択状態にな
りません。デバッグプリントは出力されたのでイベントは勿論処理されて
います。


このあたりはぜんぜん知らないのですが、Swing の種々のイベントハンドラ内でやったことが無視されたりなにかの副作用が出たりするような場合は、そのやることを SwingUtilities.invokeLater で包むとうまく行くことがあります。(うまく行かないことも多いですが。)
1

スキルアップ/キャリアアップ(JOB@IT)