3

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

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

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

4

4 回答 4

2

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

您必须ActionKeyStroke. 但是对于 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);
                }
            }
        }
    };
于 2012-07-18T02:25:13.757 回答
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);

如果您希望即使组件没有焦点也能触发事件,请在Key Listeners上使用它们:

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

于 2012-07-17T19:17:54.673 回答
1

与其Control显式使用键作为修饰符,不如使用MASK返回的 bygetMenuShortcutKeyMask()以获得更好的跨平台用户体验。ImageApp就是一个例子

于 2012-07-18T01:58:48.197 回答