考虑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:修复了已交换的释放/按下状态(对问题的本质没有影响)