如何使用键盘激活JTextField

时间:2015-04-07 21:58:23

标签: java jpanel focus jbutton jtextfield

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

2 个答案:

答案 0 :(得分:1)

您需要将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();
    }
}

答案 1 :(得分:1)

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

作为例子