我目前正在为另一个应用程序开发一个小型实用程序窗口,并且遇到了当用户专注于 JTextField 时 KeyListener 输入停止检测输入的问题。
我在这里做了一个简单的例子来展示这一点:
JFrame f = new JFrame();
f.setLayout(null);
f.setSize(500,500);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
JTextField txt = new JTextField(15);
txt.setSize(100, 30);
f.add(txt);
f.repaint();
f.revalidate();
f.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyPressed(KeyEvent e) {
System.out.println(KeyEvent.getKeyText(e.getKeyCode()));
}
@Override
public void keyReleased(KeyEvent e) {}
});
虽然没有关注文本字段,但它按预期工作,但是一旦单击文本字段,keyPressed 方法就会停止被调用。
我知道这是预期的行为,并且已经在这里多次回答了这个问题,但我正在使用多个文本输入,我不想为每个输入添加一个文档侦听器。有什么办法可以实现我想要实现的目标吗?
再次强调,为了最正确地回答这个问题,最好准确地知道你想要引发什么行为。话虽如此,使用 KeyListener 几乎总是需要避免的。也许您想要一个键盘焦点管理器来捕获应用程序的所有击键?我不知道。一种方法如下所示:
public static final char FIRST_CHAR = ' '; // or whichever char you choose
public static final char LAST_CHAR = '~'; // or whichever char you choose
JPanel panel = new JPanel();
panel.setFocusable(true);
JTextField txt = new JTextField(15);
panel.add(txt);
panel.setPreferredSize(new Dimension(500, 300));
KeyboardFocusManager kbfm = KeyboardFocusManager.getCurrentKeyboardFocusManager();
kbfm.addKeyEventDispatcher(new KeyEventDispatcher() {
public boolean dispatchKeyEvent(KeyEvent e) {
if (e.getID() == KeyEvent.KEY_PRESSED
&& e.getKeyCode() >= FIRST_CHAR
&& e.getKeyCode() <= LAST_CHAR){
// do whatever with the key information here.
System.out.println("Key pressed: " + e.getKeyChar());
}
// Allow event to be redispatched
return false;
}
});
JFrame f = new JFrame("Main02");
f.add(panel);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);