2

私は次のようなクラスWorldを持っています:

public class World extends JFrame implements KeyListener {
    public boolean left = false, right = false, back = false, fwd = false;

    public World() {
        this.setSize(600, 600);
        this.setVisible(true);
    }

    @Override
    public void keyPressed(KeyEvent e) {
        if(e.getExtendedKeyCode() == KeyEvent.VK_LEFT) left = true;
        if(e.getExtendedKeyCode() == KeyEvent.VK_RIGHT) right = true;
        if(e.getExtendedKeyCode() == KeyEvent.VK_UP) fwd= true;
        if(e.getExtendedKeyCode() == KeyEvent.VK_DOWN) back = true;
        System.out.println("L:"+left+" R:"+right+" F:"+fwd+" B:"+back);
    }

    @Override
    public void keyReleased(KeyEvent e) {
        if(e.getExtendedKeyCode() == KeyEvent.VK_LEFT) left = false;
        if(e.getExtendedKeyCode() == KeyEvent.VK_RIGHT) right = false;
        if(e.getExtendedKeyCode() == KeyEvent.VK_UP) fwd= false;
        if(e.getExtendedKeyCode() == KeyEvent.VK_DOWN) back = false;
        System.out.println("L:"+left+" R:"+right+" F:"+fwd+" B:"+back);
    }

    @Override
    public void keyTyped(KeyEvent e) {}
}

これは、理論的には、キーを押したり離したりするとトリガーされますが、トリガーされません。フレーム内のコンポーネントは正しく描画されています。

フレームは次のようにインスタンス化されています。

World m = new World();
m.getContentPane().setBackground(Color.BLACK);

キーリスナーを解雇させることができないようです。システムアウトはありません。何かご意見は?

4

2 に答える 2

6

を追加しないことを除けば、デフォルトではフォーカスできないため、ウィンドウに送信されませんKeyListener。それ自体が機能するにはフォーカスが必要です。このため、Swingで対話するための推奨される方法は、コンポーネントにフォーカスせずに機能するキーバインディングを使用することです。JFrameKeyEventsKeyEventsKeyStrokes

于 2013-03-23T20:22:14.033 に答える
5

いいえ、あなたはインターフェースを実装していますが、それが重要であることを何も言わないでください。

コンストラクターでこれを書くことができます:

addKeyListener(this);

...それは正しいことをするだろうと私は信じています。基本的に、何かがキーリスナーを追加する必要があります。インターフェイスを実装するだけでは、その実装の使用が自動的に開始されるわけではありません。

于 2013-03-23T20:20:39.563 に答える