单键按下的多个KEY_PRESSED事件(等于' ='键)

时间:2014-10-15 17:00:35

标签: java macos swing java-7 keylistener

当我输入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

我无法找到与此相关的任何错误报告。这有什么解释吗?作为一种解决方法,我能想到的就是根据时间戳忽略这些多个事件。

1 个答案:

答案 0 :(得分:1)

Oracle网站上的相关错误报告是here

此错误的原因是MacOS本身。我只是尝试在普通的非Java应用程序(Firefox和终端)中按⌘=,然后我得到缩放操作,应该由⌘+激活。请注意,列表中的一个事件的keyChar为“+”而不是“=”。

我认为Apple之所以这样做是因为更多的应用程序使用⌘+而不是⌘=,并且他们不想强迫用户点击⌘⇧=。所以他们做了一系列事件,让应用程序处理它。但这完全是对我的推测。