0

KeyEvent マネージャーを機能させるために、いくつかの小さなコードを書きました。

ご覧のとおり、JFrame を作成し、Game クラスのオブジェクトである gameComponent を追加しました。JPanel をフォーカス可能に設定し、フォーカスを要求しました。次に、TAdapter という KeyAdapter を KeyAdapter として設定しました。KeyAdapter とメソッド keyPressed() を拡張するコードのまさにそのクラスを見ることができます。

キーが押されたときに「押されました」とコンソールに出力するようにプログラムに指示しましたが、何も起こりません。

自分が何を間違えたのかわかりません。誰かが自分では見ないバグを見つけたのではないでしょうか?

どんな助けでも大歓迎です

前もって感謝します

    public class Game extends JPanel {

public static final int WIDTH = 320;
public static final int HEIGHT = 240;
public static final int SCALE = 3;

public Game() {
    addKeyListener(new TAdapter());
    setFocusable(true);
    requestFocus();
}

public static void main(String[] args) {
    Game gameComponent = new Game();
    Dimension size = new Dimension(WIDTH*SCALE, HEIGHT*SCALE);
    JFrame frame = new JFrame("Invaders");

    frame.setVisible(true);
    frame.setSize(size);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(false);
    frame.add(gameComponent);
}

public class TAdapter extends KeyAdapter {

    public void keyPressed(KeyEvent e) {
        System.out.println("Pressed");
    }
}   
}
4

1 に答える 1

4
requestFocus();

使用する適切な方法は次のとおりです。

requestFocusInWindow();

ただし、これらのメソッドは可視コンポーネントでのみ呼び出すことができるため、そのメソッドでさえ機能しません。コンポーネントを作成した時点ではまだ表示されていないため、そのコード行は削除してください。

コードの主な問題は、フレームが表示された後にコンポーネントをフレームに追加することです。コードは次のようになります。

frame.add(gameComponent);
frame.setSize(size);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setVisible(true);

これはsetVisible(true)、すべてのコンポーネントがフレームに追加された後に行う最後の作業です。

最後に、KeyListener を使用するべきではありません。Swing はKey Bindingsで使用するように設計されています。キー バインドを適切に使用すると、フォーカスの問題は発生しません。

于 2013-08-28T19:37:38.157 に答える