Java 单次按键的多个按键事件(等于';=';键)
当我键入Command equals时,我在使用Java7(更新67)的OSX中看到了这一点(⌘=). 以下是一个例子:Java 单次按键的多个按键事件(等于';=';键),java,macos,swing,java-7,keylistener,Java,Macos,Swing,Java 7,Keylistener,当我键入Command equals时,我在使用Java7(更新67)的OSX中看到了这一点(⌘=). 以下是一个例子: public class Test implements KeyEventDispatcher { public Test() { JFrame frame = new JFrame(); frame.setSize(200, 200); frame.setVisible(true); } pu
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;
}
}
我看到的输出⌘=. 请注意,三个按键按下事件均为=,没有按键释放事件为=。还请注意,第二个表示keyChar为+以及完全没有按键类型的事件
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
多个事件会传播到侦听器、绑定或菜单加速器,这就是我最初发现问题的方式
为了进行比较,下面是⌘-. 没有多个事件,但仍然没有键类型的事件
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
我还没有找到任何与此相关的错误报告。对此有什么解释吗?作为一种解决方法,我所能想到的就是忽略这些基于时间戳的多个事件。Oracle网站上的相关错误报告是 这个错误的原因是MacOS本身,我只是在普通的非Java应用程序(Firefox和Terminal)中尝试按下⌘=, 我得到了缩放动作,应该由⌘+. 请注意,列表中的一个事件的keyChar为“+”而不是“=”
我想苹果这样做是因为更多的应用程序使用⌘+ 比⌘=, 他们不想强迫用户点击⌘⇧= 相反,他们做了一系列的事件,让应用程序来处理。但这完全是我的猜测。感谢链接!现在看来,基于时间戳的解决方案是唯一的解决方案。