按下alt时,KeyEventDispatcher不会捕获选项卡

时间:2017-05-18 09:47:30

标签: java windows swing awt

我开始编写自定义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方法。

0 个答案:

没有答案