Java 获取KeyEvent的源
我有两个文本字段(tf1和tf2),其中in使用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
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
}
}
}
}