0

入力された文字を取得するために KeyEvent を使用した 2 つのテキスト フィールド (tf1 と tf2) があります。

JTextField tf1 = new JTextField(10);
        JTextField tf2 = new JTextField(10);
        tf1.setFocusable(true);
        tf2.setFocusable(true);
        //regerstring for event
        tf1.addKeyListener(new KeyHandler(tf1, tf2));
        tf2.addKeyListener(new KeyHandler(tf1, tf2));








 class KeyHandler extends KeyAdapter{
    JTextField tf1;
    JTextField tf2;
    KeyHandler(JTextField tf1, JTextField tf2){
    tf1 = this.tf1;
    tf2 = this.tf2;
    }
    public void keyTyped(KeyEvent e){
    char ch = e.getKeyChar();
    System.out.println(e.getKeyLocation());

    if(e.getSource() == tf1)
        System.out.println("tf1");
    else if (e.getSource() == tf2)
    System.out.println("tf2");

    }

KeyEvent クラスの getSource() を試しましたが、 JTextField のオブジェクトを返します。tf1 と tf2 を区別する必要があります。

keyTyped() で関連するテキストファイル参照を取得するにはどうすればよいですか

4

4 に答える 4

5

100% 確信することは困難ですが、スコープに問題があるようです。あなたのキーハンドラーはあなたのフィールドを見ることができません。

public void someMethod() {
    JTextField tf1 = new JTextField(10);
    JTextField tf2 = new JTextField(10);

    KeyHandler handler = new KeyHandler();
    tf1.addKeyListener(handler);
    tf2.addKeyListener(handler);
}

public class KeyHandler extends KeyAdapter{
    public void keyTyped(KeyEvent e){
        // Error, tf1 is unknown...
        if (e.getSource() == tf1) {...}
    }
}

所有しているフィールドを比較できるようにする場合は、2 つのオプションがあります。フィールドをインスタンス フィールドとして宣言するか、nameプロパティを介してフィールドを識別します。

オプション1

public class SomeClass extends ... {
    private JTextField tf1;
    private JTextField tf2;
    public void someMethod() {
        JTextField tf1 = new JTextField(10);
        JTextField tf2 = new JTextField(10);

        KeyHandler handler = new KeyHandler();
        tf1.addKeyListener(handler);
        tf2.addKeyListener(handler);
    }

    public class KeyHandler extends KeyAdapter{
        public void keyTyped(KeyEvent e){
            // tf1 is now within scope :D
            if (e.getSource() == tf1) {...}
        }
    }
 }

オプション 2

public void someMethod() {
    JTextField tf1 = new JTextField(10);
    tf1.setName("tf1");
    JTextField tf2 = new JTextField(10);
    tf2.setName("tf2");

    KeyHandler handler = new KeyHandler();
    tf1.addKeyListener(handler);
    tf2.addKeyListener(handler);
}

public class KeyHandler extends KeyAdapter{
    public void keyTyped(KeyEvent e){
        Object source = e.getSource();
        if (source instanceof JTextField) {
            JTextField field = (JTextField)source;
            String name = field.getName();
            if ("tf1".equals(name)) {
                // Hello TextField #1
            }
        }
    }
}

免責事項

なぜあなたがやりたいことをしたいのかわかりませんが、KeyListeners はテキストフィールドのフィルタリングや変更の監視に最適なオプションではありません. 1 つには、リスナーがどの順序で呼び出されるかは保証されません。フィールドDocumentは、リスナーが起動される前に更新される場合と更新されない場合があります。第二に、ユーザーがフィールドにテキストを貼り付けた場合、それらは起動されません。

より適切な選択はDocumentListener、フィールドへの変更を監視するために使用できる 、DocumentまたはDocumentFilterドキュメントに送信されるコンテンツをフィルタするために使用できる を使用することです。

于 2012-10-24T10:24:00.840 に答える
4
  • KeyListenerSwing JComponents には使用しないでください。代わりにJTextComponentsにも使用しないでください。DocumentListener

  • KeyListener は挿入されたテキストを無視します

  • Documentあなたができる内部event.getSource()

于 2012-10-24T10:01:32.587 に答える
2

次のようにアドレスを比較します。

if (e.getSource() == tf1) { 
   // Source is the first text field
}

MadProgrammer が指摘したように、作成範囲外で使用する必要があるテキストフィールドにインスタンス変数を使用する必要があります (あなたの場合は tf1 と tf2)。

于 2012-10-24T09:59:34.827 に答える
0
public void keyTyped(KeyEvent e) {
    // retries the typed character
    char ch = e.getKeyChar();
    System.out.println(ch);
    if (e.getComponent().getName().equals("TF1")) {
        // Key Typed in Text Field 1
    } else if (e.getComponent().getName().equals("TF2")) {
        // Key Typed in Text Field 2
    }
    // associated textfield of typed char
}

tf1.setName("TF1") を使用して個々のテキスト ボックスの名前を設定します。

于 2012-10-24T10:21:06.843 に答える