Java中的自定义键盘快捷键

3

我正在开发一个Java Swing应用程序。我想添加一个键盘快捷方式,比如CTRL + H。当点击jButton1时,这个快捷方式应该执行与jButton1相同的操作。

即使jButton1没有焦点,这个快捷方式也应该以相同的方式工作。

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


动态生成Swing组件?我们可以为组件添加快捷方式,但不能应用于整个应用程序 - component.getInputMap().put(aKeyStroke, aCommand); - Chan
4个回答

3

好的 - 首先,我认为在Java Swing中没有设置应用程序范围快捷键的方法(请参考此问题)。但是对于组件而言,这是可能的。

您需要创建一个Action来使用KeyStroke。但是对于Windows,我发现这个库非常有用

    {
        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

你应该研究一下键绑定(Key Bindings),使用KeyStrokeInputMap类。从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);

当您希望在组件没有焦点时触发事件时,请使用它们而不是键盘监听器

如果要在组件没有焦点时激活键绑定,则使用键盘监听器也很困难。



1

不要直接使用Control键作为修饰符,而是使用getMenuShortcutKeyMask()返回的MASK,以获得更好的跨平台用户体验。 ImageApp是一个示例


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接