无论Focus如何,都可以为Java Swing应用程序添加键盘支持

时间:2012-10-29 00:53:44

标签: java swing event-handling keyboard keylistener

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

我尝试向KeyListener添加JFrame,但如果选择了另一个更改焦点的JComponent,则无效。

有没有正确的方法呢?

2 个答案:

答案 0 :(得分: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;
        }
    });

如果您只想获取一个窗口/组件的键输入或仅获取特定键的键输入,可以使用KeyBindings作为kleopatra建议。作为如何在按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.
    }
});

答案 1 :(得分:0)

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