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 指向包含 JPanel
的 JFrame
。我不完全确定为什么我需要这样做(我朋友的游戏不需要这个),但这是一个解决办法。
在我的 GamePanel
中,我引用了包含 GamePanel
的 JFrame
(作为其构造函数的参数)。
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,它允许您控制组件触发关键事件的焦点级别
我正在尝试为我的 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 指向包含 JPanel
的 JFrame
。我不完全确定为什么我需要这样做(我朋友的游戏不需要这个),但这是一个解决办法。
在我的 GamePanel
中,我引用了包含 GamePanel
的 JFrame
(作为其构造函数的参数)。
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,它允许您控制组件触发关键事件的焦点级别