获取KeyEvent的源代码

时间:2012-10-24 09:57:48

标签: java swing jtextfield keylistener keyevent

我有两个文本字段(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 个答案:

答案 0 :(得分: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
            }
        }
    }
}

声明

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

更好的选择是使用DocumentListener,可用于监控字段DocumentDocumentFilter的更改,这些字段可用于过滤发送到的内容文件。

答案 1 :(得分:4)

答案 2 :(得分:2)

比较地址如下:

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

MadProgrammer指出使用文本字段的实例变量需要在创建范围之外使用(在你的情况下为tf1和tf2)

答案 3 :(得分: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”)

设置单个文本框的名称