2013-04-16 78 views
0

以下代码无效。我正在尝试使用按键方法向左,向右,向上和向下移动播放器,但是当我按下按键时,它不响应。我没有粘贴整个代码,只是移动框的部分还有其他if语句来实现其他内容的移动。KeyListener不工作


public class innerClassKeyPressed { 


    void keyPressed(KeyEvent e) 
    { 
    int key= e.getKeyCode(); 
    if(key==KeyEvent.VK_LEFT){ 
     dx=-1; 
    } 
    if(key==KeyEvent.VK_RIGHT){ 

     dx=1; 
    } 
    if (key==KeyEvent.VK_UP){ 
     dy=-1; 
    } 
    if (key==KeyEvent.VK_DOWN){ 
     dy=1; 
    } 
     if (key == 82) 
    { 
      initLevel(currlevel); 

    } //R 
    if (key == 78) 
    { 
     currlevel++; 
      initLevel(currlevel); 
     } 

     if ((key == KeyEvent.VK_LEFT) && (key == KeyEvent.VK_RIGHT) && 
     (key == KeyEvent.VK_UP) && (key == KeyEvent.VK_DOWN)) { 

     return; 
     } 


     for (int row=0; row < myArray.length; row++) 

     { 
      for (int column=0; column < myArray[row].length; column++) 
      { 
       if(myArray[row][column]== Contents.PLAYER)      { 
         if (myArray[row+dy][column+dx] == Contents.BOX) 
         { 

          if (myArray[row+dy*2][column+dx*2] == Contents.EMPTY) 

          { 

           myArray[row+dy][column+dx]= Contents.PLAYER; 
           myArray[row][column]= Contents.EMPTY; 

           myArray[row+dy*2][column+dx*2]= Contents.BOX; 
+0

*“我没有粘贴整个代码”*这可能是问题在于代码未显示。为了更快地获得更好的帮助,请发布[SSCCE](http://sscce.org/)。 –

+0

好的,我会发布整个关键监听器。谢谢 –

+0

*“整个关键听众”。*没有人要求“整个关键听众”。在对“SSCCE”的含义进行随机猜测之前,请先阅读***链接的文章。 –

回答

0

正如我猜你使用一个JFrame和Canvas来绘制您的播放器,然后我也要去相信这心不是工作,因为你还没有加入的KeyListener到JFrame。

例如:

JFrame frame = new JFrame(); 
frame.addKeyListener(keylistener); 
+0

这是很多猜测。猜测更适合评论。鉴于你没有足够的代表。为了提出意见,我的建议是避免像这样的问题(有效)猜测。 –

+0

感谢您的回答,我认为这可能是问题所在。我调用了我的keylistener类innerClassKeypressed。所以我加了j.addKeyListener(innerClassKeyPressed);在我的主要方法。这可以吗? –

+1

这不是一个好主意,因为它不太可能会获得直接的键盘焦点。 – MadProgrammer

1

KeyListeners是臭名昭著的不工作(以及实际上他们做的,只是没有办法的办法,你认为他们应该)。

KeyListener的问题在于,它们只有在它们注册的组件有焦点且具有焦点(也称为键盘焦点)时才会发生反应。

相反,您应该使用Key Bindings,因为它们允许确定触发它们的焦点状态。