Java Swing中JPanel的快捷键/键绑定

3
我有一个JPanel,里面有很多组件。当用户按下"a"键时,我想做一些操作并消耗掉这个"a"键,但是如果用户在文本框内(或其他接受"a"键的屏幕部分),那么我就不想收到这个"a"键的通知。
下面的代码中,即使焦点在文本框上,我也会收到"a"键的通知(在文本框中输入"a"既会将"a"放入文本框中,也会通知我关于这个"a"键的事情)。
        JComponent jc = the panel...;
        InputMap inputMap = jc.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
        ActionMap actionMap = jc.getActionMap();
        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0), "qcAccept");
        actionMap.put("qcAccept", new AbstractAction("qcAccept") {

            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("A pressed, " + e);
            }
        });
1个回答

2
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0), "qcAccept");

您正在监听keyPressed(按键按下)事件。文本组件则侦听keyTyped(按键输入)事件。因此,两个绑定仍然有效。尝试:

inputMap.put(KeyStroke.getKeyStroke("typed a"), "qcAccept");

成功了,谢谢。我重新阅读了KeyStroke类的文档,但仍然无法根据文档弄清楚这个问题! - Mary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接