java龟兔赛跑中关于线程调用repaint无效

java龟兔赛跑中关于线程调用repaint无效


参照了
https://bbs.csdn.net/topics/390752602
按照在线程中只改变一个已经声明的面板用repaint方法使小圆点移动的想法
进行编写但是画面仍是没有改变。

import java.awt.Color;
import java.awt.Graphics;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Game extends JFrame{
	static int BeginX=50,EndX=450;
	static int rabbitX=BeginX,rabbitY=100; //定义兔子的移动坐标
	static int tortoiseX=BeginX,tortoiseY=300;//定以乌龟的移动坐标
	
	static GamePanel gPanel = new GamePanel(rabbitX,rabbitY,tortoiseX,tortoiseY); 
	//将画面面板初始化
	public Game(){
		this.add(gPanel);//加入画面面板
		this.setTitle("龟兔赛跑");
		this.setSize(800,680);
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);	
		Race race = new Race();
		race.setDistance(100);//声明比赛的长度
		Racer r = new Rabbit("兔子",5,gPanel);//声明一个兔子选手
		Racer t = new Tortoise("乌龟",1,gPanel);//声明一个乌龟选手
		r.attend(race);//将兔子加入选手列表
		t.attend(race);//将乌龟加入选手列表
		race.start();//启动线程
	}
	
	public static void main(String[] args) {
		new Game();//初始化画面
	}

	
	class Racer extends Thread{//选手类
			String name;
			Race race;
			int speed;
			int dis =0;//移动的距离
			int isEnd =0;//判断是否结束
			Racer(String name,int speed){
				this.name = name;
				this.speed = speed;
			}
			public void run() {
				
			}
			public void attend(Race r) {
				race = r;
				r.addRacer(this);
			}
	}
	class Rabbit extends Racer{//兔子选手
		boolean isSleep = false;
		GamePanel g1;
		Rabbit(String name, int speed,GamePanel g1) {
			super(name, speed);
			this.g1 = g1;//将Game类中声明的面板传入
		}
		public void run() {
			while(dis<=race.getDistance()) {
				dis += this.speed;
				//System.out.println("兔纸走了"+dis+"米");
			try {
				Thread.sleep(1000);
				rabbitX += (speed*4);
				g1.repaint();//重绘画面但是无效
				
			} catch (InterruptedException e) {
			     e.printStackTrace();
			}
			sleepy();
			if(dis==race.getDistance()) {
				isEnd=1;
			}
		}
		
	}
		public void sleepy() {//兔子睡觉50%的几率,一场比赛最多睡一次
			if(!isSleep) {
				int flag = (int)(Math.random()*2);
				if(flag==1) { //兔子要睡觉了
					System.out.println("----------兔子要睡觉了-----------");
					int sleepTime = (int)(Math.random()*61+60);
					try {
						Thread.sleep(sleepTime*1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				System.out.println(sleepTime+"----------兔子睡醒了-------------");
				isSleep = true;
			}
		}
	  }		   
	}
	class Tortoise extends Racer{//乌龟选手类
		GamePanel g2;
		Tortoise(String name, int speed,GamePanel g2) {
			super(name, speed);
			this.g2 = g2;//传入Game类声明的面板
		}
		public void run() {
			while(dis<=race.getDistance()) {
				tortoiseX += (speed*4);
				dis +=speed ;
				System.out.println("乌龟走了"+dis+"米");
			try {
				Thread.sleep(1000); 				
				g2.repaint();//重绘但无效
			} catch (InterruptedException e) {
					e.printStackTrace();
			}
			if(dis==race.getDistance()) {
				isEnd =2;
				
			}
		 }
	   }
	  }
	 class Race{//比赛类
		private int distance;//比赛距离
		private ArrayList<Racer> racers= new ArrayList<Racer>();//比赛选手列表
		public float getDistance() {
			return distance;
		}
		public void setDistance(int distance) {
			this.distance = distance;
		}
		public ArrayList<Racer> getRacers() {
			return racers;
		}
		public void setRacers(ArrayList<Racer> racers) {
			this.racers = racers;
		} 
	
		//注册一个参赛者
		public void addRacer(Racer racer) {
			racers.add(racer);
		}
		public void  start() {
			for(Racer racer:racers) {
			racer.start();
		   }
		 }
	    }
	 
}
class GamePanel extends JPanel{//画面面板
	int rabbitX,rabbitY,tortoiseX,tortoiseY;
    GamePanel(int rabbitX,int rabbitY,int tortoiseX,int tortoiseY){
    	this.rabbitX = rabbitX;
    	this.rabbitY = rabbitY;
    	this.tortoiseX = tortoiseX;
    	this.tortoiseY = tortoiseY;
    }
	public void paint(Graphics g) {
			//super.paint(g); //百度说这句可以刷新整个面板
			g.setColor(Color.RED);
			g.fillOval(rabbitX, rabbitY, 15, 15);
			g.setColor(Color.BLACK);
			g.fillOval(tortoiseX, tortoiseY ,15,15);
			g.drawLine(600, 100, 600, 350);
			g.drawString("终", 600, 120);
			g.drawString("点", 600, 220);
			g.drawString("线", 600,320);
		}
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值