2

私の問題は、フレーム画面のスペースをクリックすると、キーボードのキーが登録されなくなり、プレーヤーが動かなくなることです。

助けてくれてありがとう。

コード:

private Component comp;
....

public InputManager(Component comp) {
    this.comp = comp;
    mouseLocation = new Point();
    centerLocation = new Point();

    // register key and mouse listeners
    comp.addKeyListener(this);
    comp.addMouseListener(this);
    comp.addMouseMotionListener(this);
    comp.addMouseWheelListener(this);

    // allow input of the TAB key and other keys normally
    // used for focus traversal
    comp.setFocusTraversalKeysEnabled(false);
}

GUI コード:

Game game = new Game();
    game.setMinimumSize(new Dimension(WIDTH * 2, HEIGHT * 2));
    game.setPreferredSize(new Dimension(WIDTH * 2, HEIGHT * 2));
    game.setMaximumSize(new Dimension(WIDTH * 2, HEIGHT * 2));

    frame = new JFrame(Game.NAME);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLayout(new BorderLayout());
    frame.add(game);
    frame.pack();
    frame.setResizable(false);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    game.start();
4

1 に答える 1

9

KeyListener を使用してキー入力をリッスンしていると仮定します。これは、リッスンしているコンポーネントにフォーカスがある場合にのみ機能することに注意してください。JFrame でマウスを押すと、リッスンしているコンポーネントがフォーカスを失う可能性があります。

解決策は、KeyListener を使用するのではなく、代わりにKeyListener およびより高いレベルの概念よりも堅牢なキー バインディングを使用することです。

また、これをリスナーとして使用するのをやめたいと思うでしょう。プログラムがおもちゃのプログラム以上のものになると、それ自体を独自のリスナーとして使用する GUI クラスを維持することが非常に難しくなります。

また、「そうそう Game.java extends Canvas」について: AWT と Swing コンポーネントを不必要に混在させないでください。これにより副作用が発生する可能性があります。代わりに、Canvas の代わりに JPanels などのすべての Swing コンポーネントを使用してください。

于 2012-08-03T21:54:33.630 に答える