【问题标题】:Java Keybinding Plus KeyJava 键绑定加键
【发布时间】:2013-03-24 22:55:59
【问题描述】:

我试图在我正在创建的图像编辑应用程序中创建用于放大和缩小的快捷方式,但我发现了一些奇怪的东西。要绑定 ctrl + + 的组合,我必须使用 = 键和一个控制和移位掩码:

getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_EQUALS, KeyEvent.CTRL_DOWN_MASK + KeyEvent.SHIFT_DOWN_MASK),"ZoomIn");

我尝试直接绑定到VK_PLUS 的组合都不起作用:

getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_PLUS, KeyEvent.CTRL_DOWN_MASK + KeyEvent.SHIFT_DOWN_MASK),"ZoomIn");

getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_PLUS, KeyEvent.CTRL_DOWN_MASK),"ZoomIn");

它现在与第一行代码一起工作,但我想知道为什么底部两个都不起作用,如果键盘没有 +,这是否(理论上​​)会成为问题> 键作为移位的 = 键。

【问题讨论】:

  • 你显然不明白修饰符是如何使用的。你的第二个例子几乎是正确的,但第二个参数是a bitwise-ored combination of any modifiers(来自JavaDocs)不是的总和
  • @MadProgrammer 是的,我忘了我应该使用按位或而不是加法,但这不是问题。
  • 我看到的问题是,您似乎认为KeyEvent.VK_PLUS 代表+ 符号上方的= 符号。我认为 KeyEvent.VK_PLUS 实际上代表小键盘上的 + 键。你可以做的是使用带有shift+ctrl修饰符的KeyEvent.VK_EQUALS和带有ctrl修饰符的KeyEvent.VK_PLUS
  • 我的立场是正确的,小键盘+VK_ADD

标签: java swing keyboard-shortcuts key-bindings


【解决方案1】:

对于数字小键盘加试试KeyEvent.VK_ADD

getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ADD,
                KeyEvent.CTRL_DOWN_MASK), "plus");

对于主键盘上的加号(美式键盘布局)使用:

getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_EQUALS, KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK),"plus"); 

对于非美式键盘,请使用 VK_PLUS。有关一些说明,请参阅错误 42620446942481

【讨论】:

  • 谢谢,这似乎与我的测试一致!
  • @scaevity 不客气! :) VK_PLUS 周围似乎有些混乱。看起来它用在+ 位于主要层的键盘上,而在美国键盘上它位于次要层。
  • 同理,ctrl -KeyEvent.VK_MINUSKeyEvent.VK_SUBTRACT(小键盘)。
【解决方案2】:

据我了解,VK_ADD 实际上用于小键盘 +

为了使用出现在键盘顶部(数字行旁边)的 +,您需要在物理上键入 shift+=

在这种情况下,您需要使用带有KeyEvent.SHIFT_DOWN_MASK 修饰符的KeyEvent.VK_EQUALS

但您也需要KeyEvent.CTRL_DOWN_MASK 修饰符。

im.put(KeyStroke.getKeyStroke(KeyEvent.VK_EQUALS, KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK), "Test1");

你遇到的问题是修饰符是a bitwise-ored combination of any modifiers

【讨论】:

  • 嗯... VK_ADD 似乎是数字键盘,但我无法让数字键盘或普通键盘与 VK_PLUS 一起使用。
  • @scaevity 是的,你说得对,VK_ADD 用于数字键盘。我找不到VK_PLUS 的任何用途,它可能用于不同的键盘布局。我上面使用的示例代码对我来说很好......
  • @MadProgrammer +1,令人惊讶的是规范中没有关于此的内容。
  • @Aqua 是的,这就是测试代码时吓坏我的原因:P
【解决方案3】:

我今天遇到了同样的问题:我想捕捉 Ctrl + =,我们按下想 Ctrl + +,并将其与放大操作相关联。我使用巴西 ABNT2 键盘。打字时,要获得加号,我需要使用组合Shift + =,所以我抓不到Ctrl + + 直接。我可以像@Aqua 建议的那样做,即实际捕获 Ctrl + Shift + =,但这对我来说似乎并不自然。我决定看看一些应用程序是如何解决这个问题的。

Notepad++ 关联放大和缩小到数字键盘的加号和减号,分别。这是解决问题的简单方法,但这也不是我想要的。 Mozilla Firefox,反过来,正是我想要的:它说 Ctrl + + 是放大的组合键,但它实际捕获的是 Ctrl + =。此外,它还可以理解我是否使用小键盘的加号来放大。

我是如何解决这个问题的

所以,这就是我决定解决问题的方法:在创建Action 时,我将组合键 Ctrl + + 与放大操作相关联,实际上是抓不到的:

Action zoomInAction = new AbstractAction() {
    @Override
    public void actionPerformed(ActionEvent event) {
        zoomIn();
    }
};

zoomInAction.putValue(AbstractAction.ACCELERATOR_KEY,
        KeyStroke.getKeyStroke(KeyEvent.VK_PLUS, KeyEvent.CTRL_DOWN_MASK));

JMenuItem zoomInMenuItem = new JMenuItem(zoomInAction);
viewMenu.add(zoomInMenuItem);

洞中的王牌是把Ctrl + =组合接开,一视同仁:

frame.addKeyListener(new KeyListener() {
    @Override
    public void keyTyped(KeyEvent event) {
    }

    @Override
    public void keyReleased(KeyEvent event) {   
    }

    @Override
    public void keyPressed(KeyEvent event) {
        if (event.isControlDown() && (event.getKeyCode() == KeyEvent.VK_EQUALS)) {
            zoomIn();
        }
    }
});

这样,界面(即JMenuItem对应Action)告诉用户使用快捷键Ctrl + +放大. 用户然后按下 Ctrl + =,想到 Ctrl + +,但应用程序理解该组合并按照用户的期望行事。

这是我的第一个 Stack Overflow 答案,很抱歉:)

【讨论】:

    猜你喜欢
    • 2012-01-02
    • 1970-01-01
    • 2013-06-27
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 2013-02-23
    相关资源
    最近更新 更多