2013-05-02 54 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