如何用键盘激活 JTextField

How to activate JTextField with a keyboard

我在另一个 JPanel 中有两个 JPanel。其中一个内部有一个 JTextField,另外几个 JButton。我希望每次用户开始输入时都将焦点设置在 JTextField 上(即使此时其中一个按钮具有焦点)。

您需要将 KeyListener 附加到 JPanel 中的所有控件,并引用您想要关注的 JTextField,如下所示:

panel.addKeyListener(new KeyPressedListener(yourTextField));
button1.addKeyListener(new KeyPressedListener(yourTextField));
button2.addKeyListener(new KeyPressedListener(yourTextField));

class KeyPressedListener implements KeyListener
{
    private JTextField textFieldToFocus;

    public KeyPressedListener(JTextField textFieldToFocus)
    {
         this.textFieldToFocus = textFieldToFocus;
    }

    @Override
    public void keyPressed(KeyEvent e) {
        textFieldToFocus.requestFocus();
    }
}

KeyListener 不会工作,因为为了让它触发按键事件,它注册到的组件必须是可聚焦的并且有焦点,这意味着你必须附加一个 KeyListener 到屏幕上可能可见的每个组件,这显然不是一个实用的想法。

相反,您可以使用 AWTEventListener,它允许您注册一个侦听器,该侦听器将通知您所有已通过事件队列处理的事件。

注册过程允许您指定您感兴趣的事件,这样您就不需要不断地尝试和过滤掉您不感兴趣的事件

对于 example。现在,您可以在触发键时自动聚焦 textField,但您应该检查事件是否由文本字段触发,如果是则忽略它

您需要做的另一件事是在文本字段未获得焦点时将按键事件重新分派到文本字段,否则该字段将不会显示触发它的字符...

类似...

if (Character.isLetterOrDigit(e.getKeyChar())) {
    filterField.setText(null);
    filterField.requestFocusInWindow();
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            filterField.dispatchEvent(e);
        }
    });
}

举个例子