我开始编写自定义KeyAdaptor,以便释放alt键会触发突出显示菜单栏中第一项的事件,以模拟本机Windows程序通常的工作方式。然后我注意到,当我alt-tab out并释放alt时,程序将失去焦点并同时突出显示菜单项,这会导致散焦程序闪烁通知。
我发现此行为很烦人,因此我尝试在按下Tab键时禁用alt释放事件。然后我发现由于tab是焦点遍历键,它被焦点系统消耗。所以我读到了KeyEventDispatcher,它预先监听了关键事件,然后切换到了。现在它确实检测到标签按下,但是当alt键关闭时却没有。为什么会发生这种情况,我该如何解决呢?
private class KeyController implements KeyEventDispatcher {
//true == pressed, false == not pressed
private boolean[] keyStates = new boolean[256];
private boolean ignoreNextAltRelease = false;
private void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ALT) {
if (!ignoreNextAltRelease) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
menuBar.getMenu(0).doClick();
}
});
}
ignoreNextAltRelease = false;
}
}
private void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_TAB) {
if (keyStates[KeyEvent.VK_ALT]) {
ignoreNextAltRelease = true;
}
}
}
@Override
public boolean dispatchKeyEvent(KeyEvent e) {
if (e.getID() == KeyEvent.KEY_PRESSED) {
keyStates[e.getKeyCode()] = true;
keyPressed(e);
}
else if (e.getID() == KeyEvent.KEY_RELEASED) {
keyStates[e.getKeyCode()] = false;
keyReleased(e);
}
return false;
}
当我按下alt然后按Tab键时,keyPressed方法永远不会在选项卡上调用,但是当释放tab时,会在tab上调用keyReleased方法。当我同时释放两个键时,在alt和tab上调用keyReleased方法。