0

私はここでかなり単純なものが欠けていると確信していますが、それを見つけることができません!

これが私のGamePanelクラスの宣言です:

private class GamePanel extends JPanel implements KeyListener {

そのコンストラクターには次のものがあります。

addKeyListener(this);

コンストラクターでも:

        new Thread(new Runnable() {

            @Override
            public void run() {
                while (true) {
                    index ++;
                    index = index >= 15 ? 0 : index;
                    if (aPress) {
                        playerX --;
                    }
                    if (dPress) {
                        playerX ++;
                    }
                    repaint();
                    try {
                        Thread.sleep(25);
                    } catch (InterruptedException e) {}
                }
            }

        }).start();

クラスで:

    @Override
    public void keyPressed(KeyEvent e) {
        System.out.println("Key pressed!");
        if (e.getKeyCode() == KeyEvent.VK_A) {
            aPress = true;
        }
        if (e.getKeyCode() == KeyEvent.VK_D) {
            dPress = true;
        }
    }
    @Override
    public void keyReleased(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_A) {
            aPress = false;
        }
        if (e.getKeyCode() == KeyEvent.VK_D) {
            dPress = false;
        }
    }

そして最後に:

JFrame f = new JFrame();
//set up f
f.add(new GamePanel());
f.setVisible(true);

System.out.printlnメソッドにaを追加しても、keyPressed印刷されません。私は何が欠けていますか?

4

2 に答える 2

5

KeyListener気まぐれな愛人です。が登録されているコンポーネントは、KeyListenerフォーカス可能である必要があり、主要なイベントを受信するためにフォーカスを持っている必要があります。

リスナーを登録した後、追加setFocusable(true);してみてください。requestFocusInWindow();

より良いアイデアはキーバインディングを使用することです、これは焦点の問題を克服します。

InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
ActionMap am = getActionMap();
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0, false), "a.pressed");
am.put("a.pressed", new AbstractAction() {
    public void actionPerformed(ActionEvent evt) {
        aPress = true;
    }
});
于 2012-11-29T03:16:19.650 に答える
2

setFocusable(true);GamePanelコンストラクターに追加します。

于 2012-11-29T03:15:51.140 に答える