【问题标题】:Custom keyboard shortcut in javajava中的自定义键盘快捷键
【发布时间】:2012-07-16 18:28:22
【问题描述】:

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

即使 jButton1 没有获得焦点,此快捷方式的行为也应该相同。

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

【问题讨论】:

  • 动态生成 Swing 组件?我们可以向组件添加快捷方式,但不能在应用范围内添加 - component.getInputMap().put(aKeyStroke, aCommand);

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


【解决方案1】:

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

您必须为KeyStroke 创建一个Action。但是对于 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);
                }
            }
        }
    };

【讨论】:

    【解决方案2】:
    【解决方案3】:

    您应该查看Key Bindings,使用类KeyStroke 和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.

    【讨论】:

      【解决方案4】:

      不要将 Control 键明确用作修饰符,而是使用 getMenuShortcutKeyMask() 返回的 MASK 以获得更好的跨平台用户体验。 ImageApp是example。

      【讨论】:

        猜你喜欢
        • 2012-08-28
        • 1970-01-01
        • 2012-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-27
        相关资源
        最近更新 更多