在 JTextField 中键入时继续使用 KeyListener 检测输入

问题描述 投票:0回答:1

我目前正在为另一个应用程序开发一个小型实用程序窗口,并且遇到了当用户专注于 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 方法就会停止被调用。

我知道这是预期的行为,并且已经在这里多次回答了这个问题,但我正在使用多个文本输入,我不想为每个输入添加一个文档侦听器。有什么办法可以实现我想要实现的目标吗?

java swing jframe jtextfield keylistener
1个回答
0
投票

再次强调,为了最正确地回答这个问题,最好准确地知道你想要引发什么行为。话虽如此,使用 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);
© www.soinside.com 2019 - 2024. All rights reserved.