【问题标题】:Binding key combination to JFrame将组合键绑定到 JFrame
【发布时间】:2012-06-05 01:43:42
【问题描述】:

到目前为止,我已经使用 ESC 键关闭窗口,使用以下代码:

KeyStroke escapeKeyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0, false);
    Action escapeAction = new AbstractAction() {
         public void actionPerformed(ActionEvent e) {
            screen.dispose();
         }
    };
screen.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(escapeKeyStroke, "ESCAPE");
screen.getRootPane().getActionMap().put("ESCAPE", escapeAction);

但我想知道如何添加 CTRL+A 事件?我记得阅读过一种为按键/释放设置布尔值的方法,但我没有看到使用这段代码,所以我想知道如何实现 CTRL+A。

谢谢

【问题讨论】:

    标签: java swing keyboard-shortcuts action keystroke


    【解决方案1】:

    重要的是KeyStroke.getKeyStroke(...) 方法的第二个参数,因为您需要在那里使用InputEvent.CTRL_DOWN_MASK 让 KeyEvent.VK_A 成为一个控制-A。

    例如,

    KeyStroke ctrlAKeyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_A,
         InputEvent.CTRL_DOWN_MASK);
    

    我不会担心使用使用布尔值的 3 参数方法,因为您对按键更感兴趣,而不是按键或按键释放。

    关于您的评论:

    更正我之前的评论。它有效,如果我成功了,让我们说 Ctrl+W。 Ctrl+A 只是尝试在框架中的文本字段中执行其本机“全选”功能。有什么办法可以避免吗?

    据我了解,如果具有焦点的组件(例如 JTextArea)直接响应 ctrl-A 按键,这将是一个问题。为了解决这个问题,您可以向该组件添加相同的绑定,但请确保将其绑定到使用 JComponent.WHEN_FOCUSED; 条件的 InputMap。

    【讨论】:

    • 谢谢,这似乎是正确的,但你知道我会在最后两行写什么吗?现在我做到了:screen.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(ctrlAKeyStroke, "CTRLA");screen.getRootPane().getActionMap().put("CTRLA", ctrlAAction); 不幸的是,框架对 ctrl+a 或 ctrl 或 a 都没有反应。 =(
    • 更正我之前的评论。它有效,如果我成功了,让我们说 Ctrl+W。 Ctrl+A 只是尝试在框架中的文本字段中执行其本机“全选”功能。有什么办法可以避免吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    相关资源
    最近更新 更多