【问题标题】:Adding Keyboard support to Java Swing application regardless of Focus无论焦点如何,都向 Java Swing 应用程序添加键盘支持
【发布时间】:2012-10-29 00:53:43
【问题描述】:

我有一个JFrame,其中包含多个面板,这些面板累积在一个相当复杂的 Swing UI 中。我想添加键盘支持,以便 不管 的组件聚焦某个按键,例如 [ENTER] 键,使听众做出反应。

我尝试将KeyListener 添加到JFrame,但如果选择另一个JComponent 来改变焦点,这将不起作用。

有没有合适的方法来做到这一点?

【问题讨论】:

  • key bindings
  • 一些组件有ActionListeners,它也会对Enter做出反应

标签: java swing event-handling keyboard keylistener


【解决方案1】:

使用 KeyboardFocusManager 注册 KeyEventDispatcher 允许您在所有键事件发送到焦点组件之前查看它们。你甚至可以修改事件或阻止它被传递到焦点组件:

KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(
    new KeyEventDispatcher() {
        public boolean dispatchKeyEvent(KeyEvent e) {
            //Get the char which was pressed from the KeyEvent:
            e.getKeyChar();
            //Return 'true' if you want to discard the event.
            return false;
        }
    });

如果您只想获取一个窗口/组件或特定键的键输入,您可以按照 kleopatra 的建议使用 KeyBindings。作为如何在按下 Enter 时注册到键盘事件的示例(您可以使用 KeyEvent 提供的任何 VK_,对于修饰符 [alt、ctrl 等],请参见 InputEvent)参见:

JFrame frame = new JFrame(); //e.g.
JPanel content = (JPanel)frame.getContentPane(); 
content.getInputMap().put(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_ENTER,0),"enterDown");
content.getActionMap().put("enterDown",new AbstractAction() {
    private static final long serialVersionUID = 1l;
    @Override public void actionPerformed(ActionEvent e) {
        //This action is called, as the Enter-key was pressed.
    }
});

【讨论】:

  • 当小刀可以完成这项工作时,不要使用电锯 ;-) 父级中的 KeyBindings 在这里非常完美。
【解决方案2】:

我这样做的方法是使 JFrame 可聚焦并将侦听器附加到它。然后,遍历所有的 JFrame 子级并使其他所有内容都无法聚焦。 当然,这仅在您没有文本框或类似内容的情况下才有效,因为它们将变得不可编辑。

【讨论】:

  • 不,这是错误的方法 - 只需忘记 keyListener 的存在并学习如何使用 keyBindings。
猜你喜欢
  • 2019-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 2011-12-24
相关资源
最近更新 更多