KeyListener无法收听

时间:2015-04-06 20:47:56

标签: java swing keylistener keyevent

我试图为我的班级制作一个Pong游戏,但我的KeyListener不会激发其各自的方法。我已经查看了various questions,但它的解决方案对我没有任何好处。

我有一个扩展JPanel的类,在其构造函数中,我有以下方法:

public final class GamePanel 
    extends javax.swing.JPanel 
    implements ActionListener, KeyListener {

public GamePanel(MainWindow Parent, WelcomePanel Sister) {
    parent = Parent;
    sister = Sister;
    ball = new Ball(this);
    Player1 = new Paddle(this, "left", "user");
    Player2 = new Paddle(this, "right", "user");
    setVisible(true);
    Timer t = new Timer(60, this);
    t.start();
    addKeyListener(this);
    this.requestFocusInWindow();
    setFocusable(true);
}

public void keyPressed(KeyEvent event) {
    Player1.keyPressedEvent(event) // Get's KeyCode, puts it in a switch and moves 
                                   // the increment of the paddle accordingly.

Player1.keyPressedEvent(KeyEvent event)

public void keyPressedAction(KeyEvent event) {
    int code = event.getKeyCode();

    if (this.side.equals("left")) {

        switch (code) {
        case KeyEvent.VK_UP:
            this.yIncrement = 10;
            break;
        case KeyEvent.VK_DOWN:
            this.yIncrement = -10;
            break;
        case KeyEvent.VK_LEFT:
            this.xIncrement = -10;
            break;
        case KeyEvent.VK_RIGHT:
            this.xIncrement = 10;
            break;
        }
    }
    else if (this.side.equals("right")) {

        switch (code) {
        case KeyEvent.VK_W:
            this.yIncrement = 10;
            break;
        case KeyEvent.VK_S:
            this.yIncrement = -10;
            break;
        case KeyEvent.VK_A:
            this.xIncrement = -10;
            break;
        case KeyEvent.VK_D:
            this.xIncrement = 10;
            break;
        }
    }
}

出现故障的原因是否会对ActionListener产生干扰?我对Java很陌生,但看过我朋友的代码之后,使用它并没有问题。问题是球拍根本不动。

2 个答案:

答案 0 :(得分:0)

所以,我想出了这个问题。您必须确保在KeyListener内添加JFrame,而不是JPanel。我不完全确定这是否与我在另一个类中扩展JFrame这一事实有关,但将KeyListener添加到JPanel不起作用(通过{ {1}}也不通过明确添加它。因此,您需要KeyListener指向包含implements的{​​{1}}。我不完全确定为什么我需要这样做(我的朋友和游戏不需要这个),但这是一个解决方法。

在我的JFrame中,我引用了JPanel,其中包含GamePanel(作为其构造函数的参数)。

JFrame

执行上述操作,而不是:

GamePanel

这解决了我的问题。感谢所有帮助! :)

答案 1 :(得分:0)

KeyListener在Swing中是一个糟糕的选择,并且对于有焦点相关的问题是天真的(这是它的设计方式而不是错误)。相反,你应该使用Key Bindings,它允许你控制组件触发关键事件的焦点水平