KeyListener 不会进行监听

KeyListener won't do its listening

我正在尝试为我的 class 制作 Pong 游戏,但我的 KeyListener 不会触发其各自的方法。我看过 various questions,但它的解决方案对我没有任何好处。

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

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 的新手,但看过我一些朋友的代码后,使用它并没有遇到任何问题。问题是桨根本不动。

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

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

public class GamePanel {

    public GamePanel(GamePanel Parent, WelcomePanel Sister) {
        this.parent = Parent; // Parent JFrame
        this.sister = Sister; // Sister JPanel that works with this JPanel

        this.parent.addKeyListener(this); // do this

执行以上操作,而不是:

public GamePanel(GamePanel Parent, WelcomePanel Sister) {
      addKeyListener(this);

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

KeyListener 在 Swing 中是一个糟糕的选择,并且由于存在与焦点相关的问题而很糟糕(这是它的设计方式而不是错误)。相反,您应该使用 Key Bindings,它允许您控制组件触发关键事件的焦点级别