0

JPanel の KeyBindings は、JFrame から JPanel を削除し、新しい JPanel オブジェクトを作成してから JFrame に追加するまで正常に機能します。

KeyBinding メソッドは新しい JPanel オブジェクトで再度実行されますが、キーは何もしません。

私の問題を示すために作成した2つのクラスを次に示します。

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");
    }
}
}
}
4

1 に答える 1

0

問題は、対象の JPanel に焦点が当てられていなかったことです。

これを変更する: getInputMap().put(KeyStroke.getKeyStroke(key), key);
これに: getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(key), key);

于 2013-03-01T05:21:38.483 に答える