//add keyboard listener
addKeyListener(new KeyAdapter(){
boolean bUp = false;
boolean bDown = false;
boolean bLeft = false;
boolean bRight = false;

public void keyPressed(KeyEvent e){
int keyCode = e.getKeyCode();
{
   if (keyCode == KeyEvent.VK_UP)
   bUp = true;
   else if (keyCode == KeyEvent.VK_DOWN)
   bDown = true;
   else if (keyCode == KeyEvent.VK_LEFT)
   bLeft = true;
   else if (keyCode == KeyEvent.VK_RIGHT)
   bRight = true;
}
{
   if (bLeft && bUp)
   moveBall(-STEP_LEN,-STEP_LEN);
   else if (bLeft && bDown)
   moveBall(-STEP_LEN,+STEP_LEN);
   else if (bRight && bDown)
   moveBall(+STEP_LEN,+STEP_LEN);
   else if (bRight && bUp)
   moveBall(+STEP_LEN,-STEP_LEN);
   else if (keyCode == KeyEvent.VK_UP)
   moveBall(0,-STEP_LEN);
   else if (keyCode == KeyEvent.VK_DOWN)
   moveBall(0,STEP_LEN);
   else if (keyCode == KeyEvent.VK_LEFT)
   moveBall(-STEP_LEN,0);
   else if (keyCode == KeyEvent.VK_RIGHT)
   moveBall(STEP_LEN,0);
}
}

public void keyReleased(KeyEvent e){
int keyCode = e.getKeyCode();
if (keyCode == KeyEvent.VK_UP)
bUp = false;
else if (keyCode == KeyEvent.VK_DOWN)
bDown = false;
else if (keyCode == KeyEvent.VK_LEFT)
bLeft = false;
else if (keyCode == KeyEvent.VK_RIGHT)
bRight = false;
}
});
setFocusable(true);
}
这是在JPanel里的代码,大家不用管moveBall函数,就是移动物体。8个方向,上下左右,还有斜45度方向。问题:
按键及释放顺序如果为  按12放12 响应正常,如果为  按12放21 响应会丢失1
举例:按RIGHT:右移
      按DOWN :右下移
      放RIGHT:下移
      放DOWN :停      按RIGHT:右移
      按DOWN :右下移
      放DOWN :停           //我想要 右移 代码不知哪里有逻辑错误,帮忙分析并改正下
      放RIGHT:停问题补充:
这样设计键盘响应,当按一个键不放时,才按下总不能“很快”的响应,有点停滞然后在不断移动,可以改进吗?
同样的问题发生在按下A,释放A,再按下B时。

解决方案 »

  1.   

    有时候java swing 就是那么慢..
      

  2.   

    首先.
     匹配判断用 swich case
    参考线程吧 我也不是很懂..
      友情UP一下.
      

  3.   

    按键及释放顺序如果为  按12放12 响应正常,如果为  按12放21 响应会丢失1 
    因为你按下12后, 放了2, 这时并没有键按下事件, 所以不会进入keyPressed事件处理函数中,而重新绘制球, 所以不会再响应1,而只会响应键释放事件, 而在这里面, 并没有重绘界面, 所以会失去响应。一般的做法是,在键的事件处理中只处理键被按下,即设置bUp, bDown等的值, 最后调用repaint()来重载绘制界面。然后在JPanel的paintComponent函数中绘制球时, 再来判断bUp, bDown等的值, 调用相应的绘制函数。
    这样设计键盘响应,当按一个键不放时,才按下总不能“很快”的响应,有点停滞然后在不断移动,可以改进吗? 
    至于这个问题, 把你的第一个问题解决后, 这个问题自然就解决了。
    因为绘制界面的线程是底层去处理的, 即使很短时间内有非常多的paintComponent被调用, 底层也会压缩这些绘制, 并不是每次调用paintComponent都一定会被调用, 而是进行最有效的绘制,扔掉一些不必要的操作。
      

  4.   

    谢谢10f & 11f我两种办法都试着改进下,解决了立马结贴。
      

  5.   

    难道是俄罗斯方块? 呵呵,我刚下载了ICAST的教程还没开始看。 共同学习。
      

  6.   

    已经很好的解决,用timer单独控制移动。