我试图为我的班级制作一个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很陌生,但看过我朋友的代码之后,使用它并没有问题。问题是球拍根本不动。
答案 0 :(得分:0)
所以,我想出了这个问题。您必须确保在KeyListener
内添加JFrame
,而不是JPanel
。我不完全确定这是否与我在另一个类中扩展JFrame
这一事实有关,但将KeyListener
添加到JPanel
不起作用(通过{ {1}}也不通过明确添加它。因此,您需要KeyListener指向包含implements
的{{1}}。我不完全确定为什么我需要这样做(我的朋友和游戏不需要这个),但这是一个解决方法。
在我的JFrame
中,我引用了JPanel
,其中包含GamePanel
(作为其构造函数的参数)。
JFrame
执行上述操作,而不是:
GamePanel
这解决了我的问题。感谢所有帮助! :)
答案 1 :(得分:0)
KeyListener
在Swing中是一个糟糕的选择,并且对于有焦点相关的问题是天真的(这是它的设计方式而不是错误)。相反,你应该使用Key Bindings,它允许你控制组件触发关键事件的焦点水平