- - PR -
JTextFieldのselectAllメソッドの動作について
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 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に参加している この内容がフォーカス時の選択状態に影響を与えるという気はしない のですが、何かお気づきの点がありましたらよろしくお願いいたします。 | ||||
|
投稿日時: 2004-04-22 00:35
matuさん、こんにちは。
正確には思い出せないのですが、私も何度か似たような現象を 起こした記憶があります。 そのときは確か、focusGained()でせっかく処理したものを、 その直ぐ後で focusLost()で変化させていました。 フォーカスが移動するとき、まずそれまでフォーカスがあった コンポーネントに focusLost()が通知され、次に新しく フォーカスが当たるコンポーネントに focusGained()が 通知させるという前提で設計して居りましたが、そうではない 場合もあったようです。(自信ありませんが。) JComponentの DebugGraphicsOptions機能を使えば、何か 分かるかもしれません。 | ||||
|
投稿日時: 2004-04-29 20:12
Kissingerさんお返事遅くなりまして申し訳ございません。
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しています。 どなたか同様の現象について何かお気づきの点がありましたら ご教授ください。 | ||||
|
投稿日時: 2004-04-30 15:53
unibon です。こんにちわ。
このあたりはぜんぜん知らないのですが、Swing の種々のイベントハンドラ内でやったことが無視されたりなにかの副作用が出たりするような場合は、そのやることを SwingUtilities.invokeLater で包むとうまく行くことがあります。(うまく行かないことも多いですが。) | ||||
1
