我有一个包含很多组件的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);
            }
        });

最佳答案

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

您正在侦听keyPressed事件。文本组件侦听keyTyped事件。因此,这两个绑定仍然起作用。尝试:
inputMap.put(KeyStroke.getKeyStroke("typed a"), "qcAccept");

关于java - JPanel中的Java Swing快捷键/键绑定(bind),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16349345/

10-11 00:40