package Exercise;
import java.awt.*;
import javax.swing.*;
import java.util.*;
import java.awt.event.*;public class Exercise extends JFrame
{
     public Exercise()
     {
         super("这是一次测试");
         setSize(400,300);
         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         panel myPanel=new panel();
         addKeyListener(myPanel);
         this.add(myPanel);
      
     }
     public static void main(String[] args)
     {
         Exercise e=new Exercise();  
         e.setVisible(true);
     }
    
}
class panel extends JPanel implements KeyListener
{
    myTank mt=null;
   
    public panel()
    {
        mt=new myTank(100,100);
       
    }
    public void paint(Graphics g)
    {
       super.paint(g);
        this.drawTank(mt.getX(),mt.getY(),g,mt.getType(),0);
       
        if(mt.s!=null)    
           {
               
               g.draw3DRect(mt.s.getX(), mt.s.getY(), 2, 2, false);
           }
        
     }
   public void drawTank(int x,int y,Graphics g,int type,int color)//画坦克(根据坦克的类型画出各种坦克)
   {
        switch(color)
       {       
              case 0:
               g.setColor(Color.red);
               break;
              case 1:
                g.setColor(Color.CYAN);
                break;
       }
       //用switch语句画出
       switch(type)
       {
           case 0:
               
               //向上
               g.fill3DRect(x-10, y-15, 5, 30, false);
               g.fill3DRect(x-5, y-10, 10, 20, false);
               g.fill3DRect(x+5, y-15, 5, 30, false);
               g.drawLine(x, y, x, y-15);
               break;
           case 1:
               //向右
               g.fill3DRect(x-15, y-10, 30, 5, false);
               g.fill3DRect(x-10, y-5, 20, 10, false);
               g.fill3DRect(x-15, y+5, 30, 5, false);
               g.drawLine(x, y, x+15, y);
               break;
           case 2:
               //向下
              g.fill3DRect(x-10, y-15, 5, 30, false);
               g.fill3DRect(x-5, y-10, 10, 20, false);
               g.fill3DRect(x+5, y-15, 5, 30, false);
               g.drawLine(x, y, x, y+15);
               break;
           case 3:
               //向左
               g.fill3DRect(x-15, y-10, 30, 5, false);
               g.fill3DRect(x-10, y-5, 20, 10, false);
               g.fill3DRect(x-15, y+5, 30, 5, false);
               g.drawLine(x, y, x-15, y);
               break;
            
       }
       repaint();
      
   }    @Override
    public void keyTyped(KeyEvent e) {
        //throw new UnsupportedOperationException("Not supported yet.");
    }    @Override
    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode()==KeyEvent.VK_W)
        {
            mt.setType(0);
            mt.moveup();
        }else 
            if(e.getKeyCode()==KeyEvent.VK_D)
            {
                mt.setType(1);
               mt.moveright();
            }else
                if(e.getKeyCode()==KeyEvent.VK_S)
                {
                    mt.setType(2);
                    mt.movedown();
                }else
                    if(e.getKeyCode()==KeyEvent.VK_A)
                    {
                        mt.setType(3);
                        mt.moveleft();
                    }
        if(e.getKeyCode()==KeyEvent.VK_J)
        {
            mt.shot();
        
        
    }
    }    @Override
    public void keyReleased(KeyEvent e) {
        //throw new UnsupportedOperationException("Not supported yet.");
    }
}

解决方案 »

  1.   

    你在drawTank()里面调用repaint(),repaint()会触发paint(),paint()里面又this.drawTank()根本就是循环调用嘛。
      

  2.   

    哦 是不是我repaint()函数调用错误了,那我应该在哪里调用啊
      

  3.   

    一般在什么时候调用repaint()函数
      

  4.   

    如果没有自动移动的物体的话,就是在处理事件之后调用repaint();如果有自动移动的物体,那就是定时调用repaint()
      

  5.   

    在线程里面调用了,SLEEP一下