0

我有两个文本字段(tf1 和 tf2),其中使用 KeyEvent 来获取键入的字符。

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) {...}
    }
}

如果您希望能够比较您拥有的字段,您有两个选择。将字段声明为实例字段或通过其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 并不是过滤或监视文本字段更改的最合适的选项。一方面,您无法保证以什么顺序调用您的侦听Document器,在触发侦听器之前,这些字段可能会更新,也可能不会更新。其次,如果用户将文本粘贴到字段中,它们不会被触发。

更好的选择是使用 a DocumentListener,它可用于监视字段的更改Document或 a DocumentFilter,它可用于过滤发送到文档的内容。

于 2012-10-24T10:24:00.840 回答
4
于 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 回答