Java KeyListener赢得';Don’我听不进去

Java KeyListener赢得';Don’我听不进去,java,swing,keylistener,keyevent,Java,Swing,Keylistener,Keyevent,我正试图为我的类制作一个乒乓球游戏,但我的KeyListener不会使用它各自的方法。我看过了,但它的解决方案对我没有任何好处 我有一个扩展了JPanel的类,在它的构造函数中,我有以下方法: public final class GamePanel extends javax.swing.JPanel implements ActionListener, KeyListener { public GamePanel(MainWindow Parent, WelcomePa

我正试图为我的类制作一个乒乓球游戏,但我的KeyListener不会使用它各自的方法。我看过了,但它的解决方案对我没有任何好处

我有一个扩展了
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.按键事件(KeyEvent事件)


出现故障的原因可能是对
ActionListener
的干扰吗?我对Java非常陌生,但看过我朋友的一些代码后,我发现使用它并没有问题。问题是桨根本不动。

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

在我的
GamePanel
中,我有一个对
JFrame
的引用,它保存
GamePanel
(作为其构造函数的参数提供)

执行上述操作,而不是:

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

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

KeyListener
在Swing中是一个糟糕的选择,并且对于焦点相关的问题(这是它的设计方式,而不是一个bug)来说是很自然的。相反,您应该使用它来控制焦点级别,组件将在该级别触发关键事件

您是否调试并查看该方法是否真的没有被调用?也许你的移动逻辑是错误的。我已经将初始值设置为增量(25),但如果考虑到调试,那么按键实际上不会做任何事情。:)我已经在eclipse中切换了断点,但似乎没有任何东西可以转到关键侦听器方法。已执行的操作方法被激发,但没有一个关键方法被激发。您知道如何手动触发KeyEvent吗?我会看看它是否也会这样。使用a Key Bindings API,它将解决与KeyListener相关的所有问题。您似乎正在实现ActionListener,但没有满足接口的合同要求,通过实现actionPerformed方法,面板只需要聚焦,它就会工作。@Obicere如果你费心花时间看问题,也许你会注意到我已经试过了……是的,但失败了。您可以测试这一点,因为
setFocusableInWindow()
返回一个布尔值,并将返回false。您必须按其他顺序呼叫他们。因为如果成功,此问题将不会被发布。添加时,您的面板不可见<代码>此组件必须可显示、可聚焦、可见,并且其所有祖先(顶级窗口除外)必须可见,才能批准请求。文档非常清楚地说明了如何执行此操作。感谢您的回答。我只是想让你知道这是为学校准备的(我在10年级),我应该使用KeyListener接口。然后告诉你学校,
KeyListener
不起作用,Java 1.4中引入了密钥绑定API(早在2001年~),以克服其局限性,他们应该走出黑暗时代;)哈哈,好吧。我会这么做的,但我的学校今年刚撤销了计算机科学系;(
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);