2015-04-06 47 views
2

我正在尝试为我的班级制作Pong游戏,但我的KeyListener不会触发其各自的方法。我看过variousquestions,但其解决方案对我没有任何好处。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.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

我已经为增量(25)设置了初始值,但如果这被认为是调试,那么按下按键实际上不会做任何事情。 :) – Zizouz212

+0

我已经在eclipse中切换了断点,但似乎没有进入关键的侦听器方法。行动执行方法被解雇,但没有关键的方法。你知道如何手动触发KeyEvent吗?我会看看它是否也如此燃烧。 – Zizouz212

回答

0

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

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

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); 

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

+1

面板只需要可以聚焦,它会工作。 – Obicere

+0

@Obicere如果你花时间看问题,也许你会注意到我已经尝试过...... – Zizouz212

+1

是的,但它失败了。你可以用'setFocusableInWindow()'返回一个布尔值来测试它,并返回false。你必须以其他顺序给他们打电话。 – Obicere

0

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

+0

感谢您的回答。我只是想让你知道这是为了上学(我在10年级),我应该使用KeyListener接口。 – Zizouz212

+0

然后告诉你是'KeyListener'不工作,并且在1.4版本中引入了Key Bindings API(在2001年〜)以克服它的局限性,并且它们应该离开黑暗时代;) – MadProgrammer

+0

Lol,好的。我会这样做,但我的学校今年刚刚摆脱了计算机科学部门;( – Zizouz212

相关问题