获取KeyEvent的源代码

nav*_*yad 0 java swing keyevent keylistener jtextfield

我有两个文本字段(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");

    }
Run Code Online (Sandbox Code Playgroud)

我已经尝试了KeyEvent类的getSource(),但它返回了JTextField的对象,我必须在tf1和tf2之间进行区分.

如何在keyTyped()中获取关联的textfiled引用

Mad*_*mer 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) {...}
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您希望能够比较您拥有的字段,则有两种选择.将字段声明为实例字段或通过其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) {...}
        }
    }
 }
Run Code Online (Sandbox Code Playgroud)

选项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
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

放弃

现在,我不知道你为什么要做你想做的事情,但是KeyListeners不是最适合过滤或监控文本字段更改的选项.首先,您无法保证将在何种顺序调用Document侦听器,在触发侦听器之前可能会更新字段,也可能不会更新字段.其次,如果用户将文本粘贴到字段中,则不会触发它们.

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