9

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

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

4

3 回答 3

19

对于数字键盘加上尝试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

于 2013-03-24T23:05:41.990 回答
4

我今天遇到了同样的问题:我想捕捉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 答案,对任何事情都感到抱歉:)

于 2014-08-29T16:03:24.960 回答
4

据我了解,VK_ADD实际用于 numpad +

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

在这种情况下,您需要使用KeyEvent.VK_EQUALSwithKeyEvent.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

于 2013-03-24T23:14:25.703 回答