2013-02-23 66 views
0

我的JPanel的KeyBindings工作正常,直到我從我的JFrame中刪除JPanel,創建一個新的JPanel對象,然後將其添加到JFrame中。Java中的KeyBindings停止工作組件被重製後

KeyBinding方法再次在新的JPanel對象上運行,但Keys不執行任何操作。

這裏是我做了展示我的問題兩大類:

public class KeyBindingsTester { 

    static JFrame jf; 
    static KeyBindingPanel kp; 

public static void main(String[] args){ 
    new KeyBindingsTester(); 
} 
public KeyBindingsTester(){ 

    jf = new JFrame(); 
    kp = new KeyBindingPanel(); 

    jf.add(kp, BorderLayout.CENTER); 
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    jf.setVisible(true); 
} 
public static void reset(){ 
    jf.remove(kp); 
    kp = new KeyBindingPanel(); 
    jf.add(kp,BorderLayout.CENTER); 
      jf.setVisible(true); 
} 
} 

---------和麪板:

public class KeyBindingPanel extends JPanel{ 

public KeyBindingPanel(){ 
    setUpKeyBindings(); 
    System.out.println("Keybindings set up"); 
} 
public void setUpKeyBindings(){ 

    addKeyBinding("B"); 
    addKeyBinding("R"); 
} 
public void addKeyBinding(String key){ 

    getInputMap().put(KeyStroke.getKeyStroke(key), key); 
    getActionMap().put(key, new KeyBindingAction(key)); 
} 

public class KeyBindingAction extends AbstractAction{ 

    String action; 
    public KeyBindingAction(String actionName){ 
    action = actionName; 
} 
public void actionPerformed(ActionEvent e){ 
    if(action.equals("R")){ 
     KeyBindingsTester.reset(); 
    } 
    if(action.equals("B")){ 
     System.out.println("BBB"); 
    } 
} 
} 
} 

回答

0

問題是焦點WASN」在討論的JPanel上。

更改此:getInputMap()。put(KeyStroke.getKeyStroke(key),key);
to this:getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(key),key);