我有两个文本字段(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()
中获取关联的文本归档引用答案 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
属性标识字段。
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
}
}
}
}
现在,我不知道你为什么要做你想做的事情,但是KeyListener
不是过滤或监控文本字段更改的最合适的选项。首先,您无法保证将调用侦听器的顺序,在侦听器被触发之前,字段Document
可能会也可能不会更新。其次,如果用户将文本粘贴到字段中,则不会触发它们。
更好的选择是使用DocumentListener
,可用于监控字段Document
或DocumentFilter
的更改,这些字段可用于过滤发送到的内容文件。
答案 1 :(得分:4)
不要将KeyListener
用于Swing JComponents,也不要将JTextComponents用于DocumentListener
KeyListener将忽略插入的文本
Document
内{li> event.getSource()
答案 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”)
设置单个文本框的名称