Java Keybinding Plus Key

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

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

对于数字键盘,请尝试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 。 有关说明 ,请参阅错误4262044和6942481 。

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

为了使用keybaord顶部出现的+ (数字行旁边),你需要明智地键入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

我今天遇到了同样的问题:我想要捕捉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(); } } }); 

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

这是我的第一个Stack Overflow答案,对不起:)