java中的自定义键盘快捷键

时间:2012-07-17 19:08:05

标签: java swing keyboard-shortcuts key-bindings acceleratorkey

我正在开发一个java swing应用程序。我想添加键盘快捷键,例如 CTRL + H 。这应该执行jButton1在单击时执行的相同操作。

即使jButton1未聚焦,此快捷方式也应以相同的方式运行。

我尝试使用KeyEventDispatcher,但它似乎对我不起作用。还有其他方法吗?

4 个答案:

答案 0 :(得分:2)

好的 - 首先我认为没有办法在Java Swing中设置应用程序范围的快捷方式(请参阅此question)。但对于一个组件来说,它是可能的。

您必须为Action创建KeyStroke。但对于Windows,我发现这个库非常helpful

    {
        KeyStroke cancelKeyStroke = KeyStroke
                .getKeyStroke((char) KeyEvent.VK_ESCAPE);
        Keymap map = JTextComponent.getKeymap(JTextComponent.DEFAULT_KEYMAP);
        map.addActionForKeyStroke(cancelKeyStroke, cancelKeyAction);
    }
    private static Action cancelKeyAction = new AbstractAction() {
        public void actionPerformed(ActionEvent ae) {
            Component comp = (Component) ae.getSource();
            Window window = SwingUtilities.windowForComponent(comp);
            if (window instanceof Dialog) {
                window.dispose();
            } else if (comp instanceof JTextComponent
                    && !(comp instanceof JFormattedTextField)) {
                JTextComponent tc = (JTextComponent) comp;
                int end = tc.getSelectionEnd();
                if (tc.getSelectionStart() != end) {
                    tc.setCaretPosition(end);
                }
            }
        }
    };

答案 1 :(得分:1)

答案 2 :(得分:1)

您应该使用类Key BindingsKeyStroke来查看InputMap。来自Oracle的TextComponentDemo(略有修改,但仍以DefaultEditorKit为例):

// CTRL + H
KeyStroke key = KeyStroke.getKeyStroke(KeyEvent.VK_H, Event.CTRL_MASK);
// bind the keystroke to an object
inputMap.put(key, DefaultEditorKit.backwardAction);

即使组件没有焦点,当您希望触发事件时,也可以在Key Listeners上使用它们:

  

Key listeners are also difficult if the key binding is to be active when the component doesn't have focus.

答案 3 :(得分:1)

不使用 Control 键作为修饰符,而是使用MASK返回的getMenuShortcutKeyMask()来获得更好的跨平台用户体验。 ImageAppexample