KeyListener没有添加

时间:2012-11-29 03:00:18

标签: java swing keylistener

我很确定我在这里错过了一些非常简单的东西,但我找不到它!

以下是我的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方法中添加了keyPressed,但它不会打印!我错过了什么?

2 个答案:

答案 0 :(得分:5)

KeyListener是一个善变的情妇。注册KeyListener的组件必须是可聚焦的,并且必须具有焦点才能接收关键事件。

注册听众后尝试添加setFocusable(true);requestFocusInWindow();

更好的想法是使用key bindings,这将成为焦点问题。

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;
    }
});

答案 1 :(得分:2)

setFocusable(true);添加到GamePanel构造函数中。