Java 获取KeyEvent的源

Java 获取KeyEvent的源,java,swing,jtextfield,keylistener,keyevent,Java,Swing,Jtextfield,Keylistener,Keyevent,我有两个文本字段(tf1和tf2),其中in使用KeyEvent获取类型化字符 JTextField tf1 = new JTextField(10); JTextField tf2 = new JTextField(10); tf1.setFocusable(true); tf2.setFocusable(true); //regerstring for event tf1.addKeyListener(new K

我有两个文本字段(tf1和tf2),其中in使用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()中获取相关的textfield引用

比较以下地址:

if (e.getSource() == tf1) { 
   // Source is the first text field
}
正如MadProgrammer所指出的,为需要在创建范围之外使用的文本字段使用实例变量(在您的例子中是tf1和tf2)

  • 不要将其用于Swing JComponents,也不要将其用于其他组件

  • KeyListener将忽略插入的文本

  • 文档中
    您可以
    event.getSource()


使用tf1设置单个文本框的名称。setName(“tf1”)

很难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 选择2 免责声明 现在,我不知道你为什么要做你想做的事情,但是
keylister
s不是过滤或监视文本字段更改的最合适的选项。首先,您无法保证您的侦听器将按什么顺序被调用,在启动侦听器之前,
Document
字段可能会更新,也可能不会更新。第二,如果用户将文本粘贴到字段中,则不会触发它们


更好的选择是使用A,它可以用来监视对
文档
字段的更改,或者使用A,它可以用来过滤发送到文档的内容。

为什么是getSource()不工作?为什么使用KeyListener而不是DocumentListener或DocumentFilter?@Lewsterin我建议文本字段在本地声明,而不是实例fields@MadProgrammer是的,说得好。看起来答案已被编辑以反映它;)从OP中可以看出,tf1&tf2不是实例变量,而是在本地声明的,您可能需要指出;)多萝西,恐怕我们不再使用Javascript了。你不能只访问外部范围中的变量:-)-100用于重新发明轮子,而错误的方式(我很清楚你喜欢KeyListener,也许AWTEvent是更好的方式,只需要关注容器),+1用于
免责声明
@mkorbel实际上我不喜欢,我更喜欢文档监听器/过滤器和键绑定。。。在很大程度上要感谢你,这个问题很模糊&没有上下文。我的意图是试着把OP带到水里,然后给他们一个冰淇淋;)@我说过我同意你吗
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) {...}
    }
}
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) {...}
        }
    }
 }
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
            }
        }
    }
}