⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fishpanel.java

📁 经典的传教士过河问题的java swt实现
💻 JAVA
字号:
package client;

import java.awt.*;
 import javax.swing.*;
 import java.awt.event.*;
 import java.util.LinkedList;
 import java.io.IOException;
 import fishinfo.FishInfo;

public class FishPanel extends JPanel implements MouseListener
 {
 	private Image Background;		//背景图片
 	private Image imageFish[] = new Image[8];	//8张鱼图片
 	private int fishTotal = 8;			//鱼的总数为8条
 	//Fish fish[] = new Fish[fishTotal];	//8条鱼,即8个线程
    LinkedList fish_list = new LinkedList();
  	private boolean k = false;		//标志,响应鼠标事件会用到
  	public FishClient  client = null;

 	public FishPanel()
 	{
 		setSize(600, 468);
 		addMouseListener(this);
 		//Background = Toolkit.getDefaultToolkit().getImage("./Pics/sea.jpg");
        Background = Toolkit.getDefaultToolkit().getImage("./pics/sea2.jpg");
 		for(int i=0; i<8; i++)
                imageFish[i]= Toolkit.getDefaultToolkit().getImage("./pics/fish0"+i+".gif");

 		int x,		//鱼的x坐标
 		    y,		//鱼的y坐标
 		    width=64,	//鱼图片的宽度(所有图片宽度都为64)
 		    height = 0;	//鱼图片的宽度(各图片高度不一致)
 		for(int i=0; i<fishTotal; i++)
 		{//初始化每条鱼(线程)的状态
 			switch(i/2)
 			{//不同的鱼对应的图片高度不一致
 				case 0: height = 56; break;		//0-1两张图片高度为56
 				case 1: case 2: height = 53; break;	//2-5四张图片高度为53
 				case 3: height = 37; break;		//6-7两张图片高度为37
 			}

 			//随机产生鱼初始出现的位置
 			x = (int)(Math.random()*(600 - width));
 			y = (int)(Math.random()*(468 - height));

 			int down = (int)(Math.random()*10)%2;	//down=1 : 向下游
 	        int right= (int)(Math.random()*10)%2;	//right=1: 向右游

 			//线程实例化
 			Fish fish = new Fish(this,x,y,width,height,i,down,right);
 			fish.id = i; //为该对象分配号码,方便以后删除
 			fish_list.add(fish);
 		}
 	}

 	public void initClient()
 	{
 	   try{
           client = new FishClient(this);
           }catch(IOException ie){ie.printStackTrace();}
 	}
 	public void endClient()
 	{
 	  client.Disconnect();
 	   client = null;
 	}
 	public void delFish(int id)
 	{
       int new_x;
       Fish fish = (Fish)fish_list.get(id);
       //保存要删除的对象信息
       if(fish.x <= 0)
           new_x = this.getWidth() - fish.width;
       else
           new_x = 0;
       FishInfo fishinfo = new FishInfo(new_x,fish.y,fish.width,
                           fish.height,fish.i,fish.down,fish.right);
 	   fish.end = true; //结束该对象线程
       fish_list.remove(id); //从链表中删除此对象
       for(int i=id;i<fish_list.size();i++)
       {
        fish = (Fish)fish_list.get(i);
        fish.id = i;
       }
       //将本机上游出去的鱼的信息发送到服务器
       client.send(fishinfo);
 	}
 	public void addFish(FishInfo fishinfo)
 	{
 	    Fish fish = new Fish(this,fishinfo.x,fishinfo.y,fishinfo.width,
 	                        fishinfo.height,fishinfo.i,fishinfo.down,fishinfo.right);
 	    fish_list.add(fish);
 	}

  	public void mouseClicked(MouseEvent e)
	{//响应鼠标点击事件
	/*
		if(k)
		{
			k = !k;
			for(int i=0; i<fishTotal; i++)
			{
				fish[i] = new Fish(this,fish[i].x,fish[i].y,fish[i].width,fish[i].height,i);
			}
   		}
		else
		{
			k = !k;
			for(int i=0; i<fishTotal; i++)
				fish[i].halt();
		} */
	}
  	public void mouseExited(MouseEvent e){}
	public void mouseEntered(MouseEvent e){}
  	public void mousePressed(MouseEvent e){}
  	public void mouseReleased(MouseEvent e){}

 	public void paintComponent(Graphics g)
 	{
 		super.paintComponent(g);
 		//g.drawImage(Background,0,0,getWidth(),getHeight(),this);
 		g.drawImage(Background,0,0,getWidth(),getHeight(),this);
 		try
 		{//加载背景图片后,等待30微妙
 			Thread.sleep(30);
 		}catch(InterruptedException e){}
 		for(int i=0; i<fish_list.size(); i++)
 		{
 			Fish fish;
 			fish = (Fish)fish_list.get(i);
             //鱼向左、右游动时,显示的图片不同
 			if(fish.right == 1)
 			    g.drawImage(imageFish[(fish.i/2)*2],fish.x,fish.y,this);//标志right=1表示向右游,画鱼
 			else
 			    g.drawImage(imageFish[(fish.i/2)*2+1],fish.x,fish.y,this);
 		}
 	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -