【问题标题】:How to activate JTextField with a keyboard如何使用键盘激活 JTextField
【发布时间】:2015-06-12 16:06:34
【问题描述】:

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

【问题讨论】:

    标签: java jpanel focus jbutton jtextfield


    【解决方案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();
        }
    }
    

    【讨论】:

    • 现在在图片中添加 100 个以上的组件,跨多个容器,这很快就会成为一个不切实际的解决方案
    • @MadProgrammer 是的,这是假设他说的只有几个控件。你的方法看起来好多了!
    • 这可能会满足 OP 的需求,谁知道呢,但我的第一个想法是它不会扩展,但这与我的经验有关;)
    【解决方案2】:

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

    举个例子

    【讨论】:

      猜你喜欢
      • 2013-08-16
      • 2015-03-27
      • 2016-10-11
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      • 2019-01-30
      • 2012-09-21
      • 1970-01-01
      相关资源
      最近更新 更多