import java.applet.Applet;
import java.awt.Button;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class move extends Applet implements KeyListener{

int x=10;
int y=10;
int i; public void init(){
i=0;
setFocusable(true);
this.addKeyListener(this);

}
public void paint(Graphics g){
g.setColor(Color.red);

g.fillOval(x, y, 10, 10);

}

public void keyPressed(KeyEvent e) {
 i=e.getKeyCode();

while(i==KeyEvent.VK_RIGHT)
{
x=x+1;
setLocation(x,y);
if(x>=1024)
{
x=0;
}
try {
Thread.sleep(10);
} catch (InterruptedException e1) {
// TODO 自动生成 catch 块
e1.printStackTrace();
}
repaint();


}
while(i==KeyEvent.VK_LEFT)
{
x=x-1;
setLocation(x,y);
if(x<=0)
{
x=1024;
}
try {
Thread.sleep(10);
} catch (InterruptedException e1) {
// TODO 自动生成 catch 块
e1.printStackTrace();
}

}
while(i==KeyEvent.VK_DOWN)
{
y=y+1;
setLocation(x,y);
if(y>=768)
{
y=0;
}
try {
Thread.sleep(10);
} catch (InterruptedException e1) {
// TODO 自动生成 catch 块
e1.printStackTrace();
}

}
while(i==KeyEvent.VK_UP)
{
y=y-1;
setLocation(x,y);
if(y<=0)
{
y=768;
}
try {
Thread.sleep(10);
} catch (InterruptedException e1) {
// TODO 自动生成 catch 块
e1.printStackTrace();
}

}

} public void keyReleased(KeyEvent e) {


} public void keyTyped(KeyEvent e) {


} }//为什么按下一个方向键时,小球就移动,按其它的方向键时就没有反应了呢????求高手解答。如何改???

解决方案 »

  1.   

    你写的程序死循环了。按哪个键都会导致死循环。你要在每个while语句加上跳出的条件。
      

  2.   


    为什么要用while判断,应该使用 if 判断
      

  3.   

    如何在while里设置跳出循环?
    我在里面设置if(i!=KeyEvent.VK_LEFT)break;
    但是还是没有反应?
      

  4.   


    那你应该设置一个标识,在Release的时候将标识设置为false。并且在每次移动的时候判断一下该标识,如果false,就break
      

  5.   


    import java.applet.Applet;
    import java.awt.Button;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    public class Dest  extends Applet implements KeyListener
    {
    int x,y;
    int w=0;
    public void start()
    {
    x=100;
    y=100;
    }
    public void init()
    {

    this.addKeyListener(this);

    }


    public void paint(Graphics g)
    {

    g.setColor(Color.red);
    g.fillOval(x,y,10,10);


    if(w==2)
    {
    if(x>=1024)
    x=0;
    else x=x+3;
    try
    {
    Thread.sleep(20);
    }
    catch(InterruptedException e)
    {
    return;
    }
    repaint();
    } if(w==3)
    {
    if(y<=0)
    y=768;
    else y=y-3;
    try
    {
    Thread.sleep(20);
    }
    catch(InterruptedException e)
    {
    return;
    }
    repaint();
    }
    if(w==4)
    {
    if(y>=768)
    y=0;
    else y=y+3;
    try
    {
    Thread.sleep(20);
    }
    catch(InterruptedException e)
    {
    return;
    }
    repaint();
    }


    }

    public void keyPressed(KeyEvent e) {
    switch(e.getKeyCode())
    {
    case KeyEvent.VK_LEFT:
    if(w==1)
    {
    if(x<=0)
    x=1024;
    else x=x-3;
    try
    {
    Thread.sleep(20);
    }
    catch(InterruptedException k)
    {
    return;
    }
    repaint();
    }

    repaint();
    break;
    case KeyEvent.VK_RIGHT:
    w=2;
    repaint();
    break;
    case KeyEvent.VK_UP:
    w=3;
    repaint();
    break;

    case KeyEvent.VK_DOWN:
    w=4;
    repaint();
    break;

    }
    }
    public void keyReleased(KeyEvent e) {}
    public void keyTyped(KeyEvent e) {}


      

  6.   

    if(w==1)
    {
    if(x<=0)
    x=1024;
    else x=x-3;
    try
    {
    Thread.sleep(20);
    }
    catch(InterruptedException k)
    {
    return;
    }
    repaint();
    }
      

  7.   

    在事件处理程序public void keyPressed(KeyEvent e) 里面将while(i==KeyEvent.VK_RIGHT) 这样语句改为
    switch case语句.
    比如:
    switch (e.getKeyCode())
    {
      case KeyEvent.VK_RIGHT:
      //处理向右移动的代码
      break;
      case KeyEvent.VK_Left:
      break;
      ...

    楼主使用while循环表示你对事件响应的理解不够,当你点击键盘方向健后,系统响应事件处理程序,
    当你再次点击是,系统会再次响应的,系统通过e.getKeyCode()可以判断每次响应的具体键.从而决
    定如何处理响应.
    java事件处理使用了Observer(监听者)模式,是存java的oo的模式应用.楼主可以看看java设计模式中对于他的讲解.