java TextField 遇到的有关问题

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);
	}

	@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());
	}
}

 

 

以上。