一开始画个圆形,能随意控制移动,从外部导入图片后,就不受控制了,
建立了两个类,一个主类,一个坦克类。不知道怎么搞的,就是动不起来,高手指点下迷津,实在感激不尽了。
省略号是省略的代码
public class TankClient extends Frame {  //主要类,用于调用坦克类
         Frame fr = new NewTank(30,30);               //创建新坦克,并传入坐标值
public void paint(Graphics g) {             //绘制Tank
         fr.paint(g);
         }         public void lauchFrame() {                  //绘制界面
          .....
          .....
         new Thread(new PaintThread()).start();              //起一个线程,不断刷新Paint方法
         fr.addKeyListener(new KeyBorad());                  //添加键盘监听器
         }

         private class KeyBorad extends KeyAdapter {              //内部类,调用 坦克类 移动方法 public void keyPressed(KeyEvent e) {
((NewTank) fr).keyPressed(e);
}
         }}
         public class NewTank extends Frame {    //坦克类
 
        
         public NewTank(int x , int y) {                           //构造方法,导入图像
this.x = x;
this.y = y;
        image = getToolkit().getImage(getClass().getResource("Tank.gif"));
        }
    
         public void paint(Graphics g) {                          //绘制坦克
     g.drawImage(image,x,y,this);
    
    
        }   
       public void keyPressed(KeyEvent e) {                 //Tank 移动方法
        int key = e.getKeyCode();                        //获得键盘任意键值,返回INT类型
        if(key == KeyEvent.VK_UP) {
         y -= TANK_MOVE_VALUE;                           //移动值常量     
          ......
          ......                         
 
}                           以上应该是代码的关键部分了,绘制图像的初始位置X,Y,这两个变量,无论我下面如何更改,坦克就是不动,我很郁闷,请高手指点下。感激不尽!!!!!!!!!!!

解决方案 »

  1.   

    建议不要覆盖paint而是覆盖paintComponent,同时在使用前先调用父类的方法
    可以试验下可行不,呵呵
      

  2.   

    楼上两位指点的我都不太明白,因为没太在AWT上下功夫,所以不理解。
      

  3.   

    在keyPressed中要调用repaint方法,省略的部分有吗?
      

  4.   


     public void keyPressed(KeyEvent e) {                 //Tank 移动方法
            int key = e.getKeyCode();                        //获得键盘任意键值,返回INT类型
    if(key == KeyEvent.VK_UP) {
             y -= TANK_MOVE_VALUE;
             System.out.println("动了吗");
             bU = true;
            }
    else if (key == KeyEvent.VK_DOWN) {
    y += TANK_MOVE_VALUE;
    bD = true;
    }
    else if(key == KeyEvent.VK_LEFT)  {
    x -= TANK_MOVE_VALUE;
    bL = true;
    }
    else if(key == KeyEvent.VK_RIGHT)  {
    x += TANK_MOVE_VALUE;
    bR = true;
    }    }这个是坦克类的完整 控制方法,没用调用 repanint方法。
    repanint方法。在在TankClient里用线程来刷的。具体如下
    private class PaintThread implements Runnable { //启动线程,不断调用paint方法,重新绘图 public void run() {
        while(true) {
           repaint();
    try {
    Thread.sleep(50);
    } catch (InterruptedException e) {
    System.out.println("睡眠被打断");
    e.printStackTrace();
    }
    }

    }

    }
      

  5.   

    这个线程在TankClient 类里,并没有在Tank类里,因为TankClient类里也有个键盘监听事件,是调用  Tank类里的键盘监听事件。
    键盘监听事件都起作用,但是图片就是无法移动
      

  6.   

    先在paint中调试,看
    1、是不是被调用了
    2、调用时的参数是否正确
      

  7.   

    啊,刚才我在键盘某个按键下,曾经用过repaint();方法,不过不管用,刚才把repaint();方法作用于整个
    keyPressed()方法里,发现起作用了,能动了~~~!!!
    非常感谢
      

  8.   

    jinxfei 我一直想寻找个师傅,您等教导我吗?
      

  9.   

    试试将 public void keyPressed(KeyEvent e) 定义在TankClient类里面。