1. ホーム
  2. java

[解決済み] JPanelでKeylistenerが動作しない。

2022-01-27 19:11:44

質問

JPanelクラスのKeyListenerを使って、矢印キーの1つが押されたときに何かをしようとしています。以下は私のコードです。

public class TestPanel extends JPanel implements KeyListener{

    public TestPanel(){
        this.addKeyListener(this);
        this.setFocusable(true);
        this.requestFocusInWindow();
    }

    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
            System.out.println("Right");

        }

        if (e.getKeyCode() == KeyEvent.VK_LEFT) {
            System.out.println("Left");
        }

    }

    public void keyTyped(KeyEvent e) {}
    public void keyReleased(KeyEvent e) {}
}

私のメインメソッドは、このパネルの新しいインスタンスをフレームに追加して表示します。JFrameにkeylistenerを追加する必要があるのでしょうか?私の場合、これは難しく非効率的なので、できればこのJPanelで動作させたいと思っています。何が間違っているのか、どなたかご存知でしょうか?

EDIT: Key Bindings コードも動作しません。

public class GamePanel extends JPanel implements ActionListener{

//Constructor
public GamePanel(){

    setupKeyBinding();
    this.setFocusable(true);
    this.requestFocusInWindow();


}

private void setupKeyBinding() {
    int condition = JComponent.WHEN_IN_FOCUSED_WINDOW;
    InputMap inMap = getInputMap(condition);
    ActionMap actMap = getActionMap();

    inMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "Left");
    actMap.put("Left", new leftAction());
}

private class leftAction extends AbstractAction {

       public void actionPerformed(ActionEvent e) {
          System.out.println("test");
       }
}

public void actionPerformed(ActionEvent e) {
    //some other game info
}
} 

なぜこれがうまくいかないのか、誰か教えてください。(私の2番目のアクションリスナーは、私のゲームに必要な他のもののためにあります。)

解決方法は?

この問題を検索すると、何度も質問され、解決されていることがわかります。

  • キーリスナーは、フォーカスされたコンポーネント上になければ機能しません。一つの解決策は、まずコンポーネントをフォーカス可能にした後、フォーカスを与えることです。
  • しかし、より良い方法はキーバインディングを使うことです。これについては、チュートリアルを参照してください。

に対する私の回答をご覧ください。 この質問 をご覧ください。