2013-05-02 68 views
3

我有一个包含大量组件的JPanel。当用户按下“a”时,我想要做某些事情并使用“a”,除非用户在文本框中(或接受“a”的屏幕的其他部分) - 在这种情况下,不想知道“a”。JPanel中的java swing快捷键/键绑定

在下面的代码中,即使焦点位于文本框(在文本框中输入“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); 
      } 
     }); 

回答

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

您现在收听的keyPressed事件。文本组件监听keyTyped事件。所以这就是为什么这两个绑定仍然有效。尝试:

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

这工作,谢谢。我重新阅读了KeyStroke类的文档,并且仍然不会根据该文档来了解这一点! – Mary 2013-05-03 14:50:35