最近做swing开发,发现一个问题,不知道是java特意为之,还是其bug,(原因找到了,不是java本身的问题,是因为我机器上装了有道,并开启了选词翻译,我猜应该是在选择字符串的时候有道截取并触发了键盘事件,导致我自己注册的键盘事件被调用。如果程序中定义了自己的“ctrl+c”快捷键,在程序空白鼠标拖动时也会触发这个“ctrl+c”事件,经调查这也是有道词典引起的。有道词典害人不浅啊...)
就是JTextField的文本选择事件会触发keyListener .
package textfield;
import java.awt.BorderLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class TextKeyTest extends JPanel implements KeyListener{
private JTextField text;
public static void main(String[] args){
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(200,200);
frame.add(new TextKeyTest());
frame.setVisible(true);
}
public TextKeyTest(){
text = new JTextField();
text.addKeyListener(this);
this.setLayout(new BorderLayout());
this.add(text,BorderLayout.CENTER);
}
@Override
public void keyTyped(KeyEvent e) {
System.out.println("keyTyped");
}
@Override
public void keyPressed(KeyEvent e) {
System.out.println("keyPressed");
}
@Override
public void keyReleased(KeyEvent e) {
System.out.println("keyReleased");
}
}
这样只要选择textField中的内容就会触发key事件,而且不止是一个,在某些业务处理中会存在bug,
例如:监听textField的键盘事件,当达到一定长度后转换焦点,
解决方案是使用DocumentListener监听输入框的输入:
package textfield;
import java.awt.BorderLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
public class TextKeyTest extends JPanel implements KeyListener,DocumentListener{
private JTextField text;
public static void main(String[] args){
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(200,200);
frame.add(new TextKeyTest());
frame.setVisible(true);
}
public TextKeyTest(){
text = new JTextField();
// text.addKeyListener(this);
text.getDocument().addDocumentListener(this);
this.setLayout(new BorderLayout());
this.add(text,BorderLayout.CENTER);
}
@Override
public void keyTyped(KeyEvent e) {
System.out.println("keyTyped");
}
@Override
public void keyPressed(KeyEvent e) {
System.out.println("keyPressed");
}
@Override
public void keyReleased(KeyEvent e) {
System.out.println("keyReleased");
}
@Override
public void insertUpdate(DocumentEvent e) {
// TODO Auto-generated method stub
System.out.println("insertUpdate: " + text.getText());
}
@Override
public void removeUpdate(DocumentEvent e) {
// TODO Auto-generated method stub
System.out.println("removeUpdate: " + text.getText());
}
@Override
public void changedUpdate(DocumentEvent e) {
// TODO Auto-generated method stub
System.out.println("changedUpdate: " + text.getText());
}
}
以上。