当我输入Command-equals(⌘=)时,我在OS X中使用Java 7(更新67)看到了这一点。这是一个例子:
public class Test implements KeyEventDispatcher {
public Test() {
JFrame frame = new JFrame();
frame.setSize(200, 200);
frame.setVisible(true);
}
public static void main(String[] args) {
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new Test());
}
@Override
public boolean dispatchKeyEvent(KeyEvent ke) {
System.out.println(ke);
return false;
}
}
我看到⌘=的输出。注意,三个KEY_PRESSED事件,全部为=,没有KEY_RELEASED事件=。另请注意,第二个表示keyChar为+以及完全缺少KEY_TYPED事件。
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=157,keyText=⌘,keyChar=Undefined keyChar,modifiers=⌘,extModifiers=⌘,keyLocation=KEY_LOCATION_RIGHT,rawCode=0,primaryLevelUnicode=0,scancode=0,extendedKeyCode=0x0] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=61,keyText==,keyChar='=',modifiers=⌘,extModifiers=⌘,keyLocation=KEY_LOCATION_STANDARD,rawCode=0,primaryLevelUnicode=0,scancode=0,extendedKeyCode=0x0] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=61,keyText==,keyChar='+',modifiers=⌘,extModifiers=⌘,keyLocation=KEY_LOCATION_STANDARD,rawCode=0,primaryLevelUnicode=0,scancode=0,extendedKeyCode=0x0] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=61,keyText==,keyChar='=',modifiers=⌘,extModifiers=⌘,keyLocation=KEY_LOCATION_STANDARD,rawCode=0,primaryLevelUnicode=0,scancode=0,extendedKeyCode=0x0] on frame0
java.awt.event.KeyEvent[KEY_RELEASED,keyCode=157,keyText=⌘,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_RIGHT,rawCode=0,primaryLevelUnicode=0,scancode=0,extendedKeyCode=0x0] on frame0
多个事件会传播到侦听器或绑定或菜单加速器,这是我最初发现此问题的方式。
为了比较,这是⌘-的输出。没有多个事件,但仍然没有KEY_TYPED事件。
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=157,keyText=⌘,keyChar=Undefined keyChar,modifiers=⌘,extModifiers=⌘,keyLocation=KEY_LOCATION_RIGHT,rawCode=0,primaryLevelUnicode=0,scancode=0,extendedKeyCode=0x0] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=45,keyText=-,keyChar='-',modifiers=⌘,extModifiers=⌘,keyLocation=KEY_LOCATION_STANDARD,rawCode=0,primaryLevelUnicode=0,scancode=0,extendedKeyCode=0x0] on frame0
java.awt.event.KeyEvent[KEY_RELEASED,keyCode=157,keyText=⌘,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_RIGHT,rawCode=0,primaryLevelUnicode=0,scancode=0,extendedKeyCode=0x0] on frame0
最后,这里是Java 6中⌘=的输出:
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=157,keyText=⌘,keyChar=Undefined keyChar,modifiers=⌘,extModifiers=⌘,keyLocation=KEY_LOCATION_RIGHT,rawCode=0,primaryLevelUnicode=0,scancode=0] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=61,keyText==,keyChar='=',modifiers=⌘,extModifiers=⌘,keyLocation=KEY_LOCATION_STANDARD,rawCode=0,primaryLevelUnicode=0,scancode=0] on frame0
java.awt.event.KeyEvent[KEY_TYPED,keyCode=0,keyText=Unknown keyCode: 0x0,keyChar='=',modifiers=⌘,extModifiers=⌘,keyLocation=KEY_LOCATION_UNKNOWN,rawCode=0,primaryLevelUnicode=0,scancode=0] on frame0
java.awt.event.KeyEvent[KEY_RELEASED,keyCode=61,keyText==,keyChar='=',modifiers=⌘,extModifiers=⌘,keyLocation=KEY_LOCATION_STANDARD,rawCode=0,primaryLevelUnicode=0,scancode=0] on frame0
java.awt.event.KeyEvent[KEY_RELEASED,keyCode=157,keyText=⌘,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_RIGHT,rawCode=0,primaryLevelUnicode=0,scancode=0] on frame0
我无法找到与此相关的任何错误报告。这有什么解释吗?作为一种解决方法,我能想到的就是根据时间戳忽略这些多个事件。
答案 0 :(得分:1)
Oracle网站上的相关错误报告是here。
此错误的原因是MacOS本身。我只是尝试在普通的非Java应用程序(Firefox和终端)中按⌘=,然后我得到缩放操作,应该由⌘+激活。请注意,列表中的一个事件的keyChar为“+”而不是“=”。
我认为Apple之所以这样做是因为更多的应用程序使用⌘+而不是⌘=,并且他们不想强迫用户点击⌘⇧=。所以他们做了一系列事件,让应用程序处理它。但这完全是对我的推测。