读书人

java TextField 遇到的有关问题

发布时间: 2012-12-20 09:53:21 作者: rapoo

java TextField 遇到的问题

最近做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);}@Overridepublic void keyTyped(KeyEvent e) {System.out.println("keyTyped");}@Overridepublic void keyPressed(KeyEvent e) {System.out.println("keyPressed");}@Overridepublic 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);}@Overridepublic void keyTyped(KeyEvent e) {System.out.println("keyTyped");}@Overridepublic void keyPressed(KeyEvent e) {System.out.println("keyPressed");}@Overridepublic void keyReleased(KeyEvent e) {System.out.println("keyReleased");}@Overridepublic void insertUpdate(DocumentEvent e) {// TODO Auto-generated method stubSystem.out.println("insertUpdate: " + text.getText());}@Overridepublic void removeUpdate(DocumentEvent e) {// TODO Auto-generated method stubSystem.out.println("removeUpdate: " + text.getText());}@Overridepublic void changedUpdate(DocumentEvent e) {// TODO Auto-generated method stubSystem.out.println("changedUpdate: " + text.getText());}}

?

?

以上。

读书人网 >编程

热点推荐