Java AWT-其他每隔一次检测到Alt键

时间:2018-08-16 19:26:53

标签: java input keyboard awt

考虑AWT框架的测试用例,我们在其中打印按键和释放事件

Frame frame = new Frame("Test");

frame.addKeyListener(new KeyListener() {
    @Override
    public void keyTyped(KeyEvent e) {}
    @Override
    public void keyReleased(KeyEvent e) {
        System.out.println("released " + e);
    }
    @Override
    public void keyPressed(KeyEvent e) {
        System.out.println("pressed " + e);
    }
});

frame.setVisible(true);

在使用CTRL和SHIFT修饰符的情况下,一切都按预期进行,并检测到按下并释放的情况。如果检测到AltGr,请同时按两次alt和两次释放(我可以克服这一点,至少它在某种程度上是一致且可检测的),但是对于ALT及其后的“类型”,请按->释放->释放->按->释放->检测到释放。

整个事件打印:

    pressed java.awt.event.KeyEvent[KEY_PRESSED,keyCode=18,keyText=Alt,keyChar=Undefined keyChar,modifiers=Alt,extModifiers=Alt,keyLocation=KEY_LOCATION_LEFT,rawCode=18,primaryLevelUnicode=0,scancode=56,extendedKeyCode=0x12] on frame0
    released java.awt.event.KeyEvent[KEY_RELEASED,keyCode=18,keyText=Alt,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_LEFT,rawCode=18,primaryLevelUnicode=0,scancode=56,extendedKeyCode=0x12] on frame0
    released java.awt.event.KeyEvent[KEY_RELEASED,keyCode=18,keyText=Alt,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_LEFT,rawCode=18,primaryLevelUnicode=0,scancode=56,extendedKeyCode=0x12] on frame0
    pressed java.awt.event.KeyEvent[KEY_PRESSED,keyCode=18,keyText=Alt,keyChar=Undefined keyChar,modifiers=Alt,extModifiers=Alt,keyLocation=KEY_LOCATION_LEFT,rawCode=18,primaryLevelUnicode=0,scancode=56,extendedKeyCode=0x12] on frame0
    released java.awt.event.KeyEvent[KEY_RELEASED,keyCode=18,keyText=Alt,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_LEFT,rawCode=18,primaryLevelUnicode=0,scancode=56,extendedKeyCode=0x12] on frame0
    released java.awt.event.KeyEvent[KEY_RELEASED,keyCode=18,keyText=Alt,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_LEFT,rawCode=18,primaryLevelUnicode=0,scancode=56,extendedKeyCode=0x12] on frame0

已发布事件中的modifiers=Alt,extModifiers=Alt除外。

我能做些什么来实现一致的行为吗?难道我做错了什么?我想显示具有按键绑定的UI选项,这些按键在按下alt时使用alt修饰符,但是当我无法始终隐藏这些选项时,这实际上是不可能的。

我已经看到有关SWT输入映射的一些建议,但不幸的是必须使用AWT。

在Java 10和Java 8上检查过的行为是相同的,但是操作系统之间确实存在差异。 linux发行版会产生正确的行为,而Windows 10和7则不会。现在问题仍然存在,究竟是错误还是功能。

编辑1:列出的代码是摆动框架,固定在AWT上,对问题没有影响。

编辑2:修复了已交换的释放/按下状态(对问题的本质没有影响)

0 个答案:

没有答案