Java Keybinding Plus Key

时间:2013-03-24 22:55:59

标签: java swing keyboard-shortcuts key-bindings

我正在尝试创建用于放大和缩小我正在创建的图像编辑应用程序的快捷方式,我发现了一些奇怪的东西。要绑定 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");

现在它的第一行代码正常工作,但我想知道为什么底部的两个都不起作用,如果键盘没有 + 键作为移位的 = 键。

3 个答案:

答案 0 :(得分:15)

对于数字小键盘,请尝试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

答案 1 :(得分:4)

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

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

在这种情况下,您需要将KeyEvent.VK_EQUALSKeyEvent.SHIFT_DOWN_MASK修饰符一起使用。

但你也想要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

答案 2 :(得分: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答案,对不起任何事情:)