我正在尝试创建用于放大和缩小我正在创建的图像编辑应用程序的快捷方式,我发现了一些奇怪的东西。要绑定 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");
现在它的第一行代码正常工作,但我想知道为什么底部的两个都不起作用,如果键盘没有 + 键作为移位的 = 键。
答案 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");
答案 1 :(得分:4)
据我了解,VK_ADD
实际上用于小键盘 + 。
为了使用键盘顶部(数字行旁边)出现的 + ,您需要输入 shift + =
在这种情况下,您需要将KeyEvent.VK_EQUALS
与KeyEvent.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答案,对不起任何事情:)