2013-07-19 159 views
3

在下面的Java文件中,我創建了一個包含面板的框架,然後嵌套第二個面板。我試圖在嵌套面板中聽按鍵。我的方法是使用輸入映射和動作映射。我發現如果我只有嵌套面板的輸入映射,事情按預期工作。但是,如果父面板也具有輸入映射,則鍵擊事件不會傳遞到嵌套面板。您可以通過註釋和取消註釋第一次調用getInputMap()。put來觀察此行爲。有沒有人有這個解決方案?偵聽嵌套面板中的擊鍵

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 

import javax.swing.AbstractAction; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.KeyStroke; 
import javax.swing.SwingUtilities; 

public class InputMapTest extends JPanel { 

    public InputMapTest() { 
     super(new BorderLayout()); 
     JPanel panel = new JPanel(); 
     KeyStroke ks = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0); 
     getInputMap().put(ks, "someAction"); 
     getActionMap().put("someAction", new AbstractAction() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       System.out.println("here1"); 
      } 
     }); 
     ks = KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0); 
     panel.getInputMap().put(ks, "someOtherAction"); 
     panel.getActionMap().put("someOtherAction", new AbstractAction() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       System.out.println("here2"); 
      } 
     }); 
     add(panel); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame frame = new JFrame(); 
       frame.getContentPane().add(new InputMapTest()); 
       frame.setSize(800, 600); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

} 
+0

只是爲了澄清,我有三個應對這個問題,他們都建議使用關鍵綁定。我沒有在上面的代碼中使用鍵綁定? –

+0

Doi ..它明確指出,在代碼中!噪音已刪除。 :P很高興你已經按照@mKorbel的專家建議分類。 :) –

回答