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

📄 groupcontroler.java

📁 模拟电梯运行的情况。该模拟软件能根据用户的要求同时生成N部电梯和M各楼层。能满足不同楼层对电梯的请求。
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package a;

import java.awt.event.*;

import javax.swing.*;







import java.awt.*;

public class GroupControler extends JPanel implements ActionListener{
	//Timer gateTimer,cageTimer;
	int gateCycle=20,cageCycle=30,reassignCycle=1000,gateWaitCycle=5000; 
	final int GOUP =1,GODOWN =-1,FREE =0;
	int numOfFloor, numOfLift;
	Lift[] group;
	int[] distance,minOrder;
	int[] upCalls,downCalls,upServer,downServer,upAlloateFail,downAlloateFail;
	Timer reassignTimer;
	Timer[] waitCloseGate;
	OutButton outBtn;
	
	int LiftsHeight, LiftsWidth, outBtnHeight, outBtnWidth;
	GroupControler(int numOfFloor,int numOfLift){
		this.numOfFloor=numOfFloor;
		this.numOfLift=numOfLift;
		init();
		JPanel liftGroup=new JPanel();
		
		liftGroup.setLayout(new GridLayout(1,numOfLift,10,8));
		for(int i=1;i<=numOfLift;i++)
			liftGroup.add(group[i]);
		
		liftGroup.setBackground(Color.WHITE);
		liftGroup.setBounds(1, 1, LiftsWidth, LiftsHeight);
		outBtn.setBounds(LiftsWidth+3, 1, outBtnWidth, outBtnHeight);
		
		setLayout(null);
		add(liftGroup);
		add(outBtn);
	}
	
	//初始化各个变量
	protected void init(){
		outBtn=new OutButton(numOfFloor);
		distance=new int[numOfFloor+1];
		minOrder=new int[numOfFloor+1];
		upAlloateFail=new int[numOfFloor+1];
		downAlloateFail=new int[numOfFloor+1];
		group=new Lift[numOfLift+1];
		for(int i=1;i<=numOfLift;i++)
			group[i]=new Lift(numOfFloor);
		
		
		upCalls=new int[numOfFloor+1];
		downCalls=new int[numOfFloor+1];
		
		for(int i=0;i<=numOfFloor;i++){
			upCalls[i]=downCalls[i]=0;
			upAlloateFail[i]=downAlloateFail[i]=0;
		}
		for(int i=1;i<=numOfLift;i++){
			group[i].gateTimer=new Timer(gateCycle,this);
			group[i].cageTimer=new Timer(cageCycle,this);
			group[i].cageTimer.start();
			
		}
		
		
		for(int i=1;i<=numOfLift;i++){
			for(int j=1;j<=numOfFloor;j++){
				group[i].innerBtn.stopButton[j].addActionListener(this);
				
			}
			group[i].innerBtn.closeButton.addActionListener(this);
			group[i].innerBtn.openButton.addActionListener(this);
			
		}
		for(int j=1;j<=numOfFloor;j++){
			outBtn.UP[j].addActionListener(this);
			outBtn.DOWN[j].addActionListener(this);
		}
		
		for(int i=1; i<=numOfLift; i++) {
			group[i].liftState.enterButton.addActionListener(this);
			group[i].liftState.exitButton.addActionListener(this);
		}
		
		reassignTimer=new Timer(reassignCycle,this);
		reassignTimer.start();
		
		waitCloseGate=new Timer[numOfFloor+1];
		for(int i=1;i<=numOfLift;i++)
		    waitCloseGate[i]=new Timer(gateWaitCycle,this);
		
		
		LiftsHeight=group[1].PanelHeight+30;
		LiftsWidth=numOfLift*(group[1].PanelWidth+20);
		outBtnHeight=group[1].PanelHeight;
	    outBtnWidth=145;
	}
	
	
	public void actionPerformed(ActionEvent e){
		
//		listen to UP buttons
		
    	  for(int i=1;i<numOfFloor;i++){
 		      if(e.getSource()==outBtn.UP[i]){
 		    	  if(upCalls[i]==0){
    		            upCalls[i]=1;
 		    	     upChoose(i);
 		          }
 		    	  
 		      }  
 		     // if(i==2)System.out.println("relativeHeeight 2: "+group[2].cage.relativeHeight);
 		   }
        
 	  
		
	
		
        //listen to DOWN buttons
          for(int i=2;i<=numOfFloor;i++){
 		    if(e.getSource()==outBtn.DOWN[i]){
   		        if(downCalls[i]==0) {
 		    	   downCalls[i]=1;
 		    	   downChoose(i);
   		        }
 		    }
 	      }
	  
    
	    
       //listen to cageTimer
	   for (int j=1;j<=numOfLift;j++ ){
 	     if(e.getSource()==group[j].cageTimer){
 	    	 group[j].liftState.liftInfo3.setText("");
 		    if(group[j].state==GOUP){
 		    	group[j].liftState.liftInfo3.setForeground(Color.BLACK);
 		    	group[j].liftState.liftInfo3.setText("运动方向:↑");
 		    	group[j].cage.moveUp();
 		    	if(group[j].cage.relativeHeight<-group[j].cage.heightOfFloor){
 		    		group[j].floor++;
 		    		group[j].cage.floor++;
 		    		setColorFloorNum(j,group[j].floor);
 		    		group[j].cage.relativeHeight=0;
 	     			testStop(j,group[j].floor);
 	     	   }
 		    	//###################
  	       }else if(group[j].state==GODOWN){
  	    	 group[j].liftState.liftInfo3.setForeground(Color.BLACK);
  	    	    group[j].liftState.liftInfo3.setText("运动方向:↓");
  	    	    group[j].cage.moveDown();
  	    	    if(group[j].cage.relativeHeight>group[j].cage.heightOfFloor){
  	    	    	group[j].floor--;
  	    	    	group[j].cage.floor--;
  	    	    	setColorFloorNum(j,group[j].floor);
  	    	    	group[j].cage.relativeHeight=0;
  	     			testStop(j,group[j].floor);
  	     	     }
  	    	    //##########################
 	       }
 	     }   
 	  }
	   
	   //listen to open button
	   for (int j=1;j<=numOfLift;j++ ){
		  if(e.getSource()==group[j].innerBtn.openButton){
			 group[j].ifOpen=true;
			 if(group[j].state==FREE)
			    group[j].gateTimer.start();
		  }
	   }
	   
	   
	   //listen to close button
	   for (int j=1;j<=numOfLift;j++ ){ 
		  if(e.getSource()==group[j].innerBtn.closeButton){
			  group[j].ifOpen=false;
			  group[j].gateTimer.start();
		 }	 
	   }	 
	   
	   
	   //listen to stop button
	   for (int j=1;j<=numOfLift;j++ ){ 
		  for(int i=1;i<=numOfFloor;i++){
			  if(e.getSource()== group[j].innerBtn.stopButton[i]){
				 if(group[j].state==FREE&&group[j].floor==i){
					 group[j].ifOpen=true;
					 group[j].gateTimer.start();
				 }else{ 
					 if((group[j].floor!=i)||((group[j].floor==i)&&(group[j].cage.relativeHeight!=0))){
					 group[j].stop[i]=1;
					 group[j].innerBtn.stopButton[i].setForeground(Color.RED);
				     getToppestLowestCalls(j,i);
					 }
				 }
			  }
		   }
	   } 
	   
	  //listen to gateTimer
	   for (int j=1;j<=numOfLift;j++ ){
		 if(e.getSource()==group[j].gateTimer){
			if(group[j].ifOpen){
				openGate(j);
			}	
			else
				closeGate(j);		 
		}
	  } 
	   
	   
	   
	  //listen to reassignTimer
	  if(e.getSource()==reassignTimer){
		  for(int i=1;i<=numOfFloor;i++){
			  if(downAlloateFail[i]==1){
				  downChoose(i);
			  }
			  if(upAlloateFail[i]==1){
				  upChoose(i);
			  }  
		  }
	  }
	  
	  for(int j=1;j<=numOfLift;j++){
	    if(e.getSource()==waitCloseGate[j]){
	    	group[j].gateTimer.start();
			closeGate(j);
			waitCloseGate[j].stop();
	    }
	  }
	   
	
	//listen to the stateButton
	  for (int i = 1; i<= numOfLift; i++) {
		  int m = group[i].liftState.getNum();
		if(group[i].cage.movement>0) {  
		  if (e.getSource() == group[i].liftState.enterButton){
			  group[i].ifOpen=true;
		    	if (m+1 <= 10) {
				    m += 1;
				    if(m >= 0) group[i].liftState.liftInfo3.setText("");
				    group[i].liftState.setNum(m);
				    
			    }
			    else {
				    group[i].liftState.liftInfo3.setText("警告:已经满人了!");
				    group[i].liftState.liftInfo3.setForeground(Color.RED);
				    m = 10;
			    }
		  }
		  else if (e.getSource() == group[i].liftState.exitButton){
	        group[i].ifOpen=true;
			  if (m-1>=0) {
				    m -=1;
				    group[i].liftState.setNum(m);
				    if(m <=10) group[i].liftState.liftInfo3.setText("");
			  }
	    	  else {
				    m = 0;
				    group[i].liftState.liftInfo3.setText("警告:已经没有人");
				    group[i].liftState.liftInfo3.setForeground(Color.RED);
			  }
			}
		}
		  if(m == 0) group[i].liftState.liftInfo1.setText("电梯空闲中.");
	      else group[i].liftState.liftInfo1.setText("电梯里有"+m+ "个人");
          group[i].liftState.liftInfo2.setText("现在电梯处于第"+group[i].floor+"层");
	  }
	}
	//open gate
	void openGate(int j){
		group[j].cageTimer.stop();
		if((group[j].cage.movement>group[j].cage.widthUpBound)){
			group[j].gateTimer.stop();
			
			if(group[j].ifOpen==true){
				waitCloseGate[j].start();
				group[j].ifOpen=false;
				
			}
		}else{
			group[j].cage.openGate();
		}	
	}
	//close gate
	void closeGate(int j){
		group[j].cageTimer.stop(); 
		
		if((group[j].cage.movement<group[j].cage.widthLowBound)){
			 
			 group[j].gateTimer.stop();
		     searchToppestLowest(j);
		     group[j].cageTimer.start();
		}else{
			group[j].cage.closeGate();
		}
	}
	
//	每次按钮按后设定最高与最低请求并设定状态
	/************************************************/ 
	 public  void getToppestLowestCalls(int callLift,int callfloor){
		    	if(group[callLift].toppestCall>numOfFloor||group[callLift].toppestCall<callfloor)
		    		group[callLift].toppestCall=callfloor;
		    	if(group[callLift].lowestCall==0||group[callLift].lowestCall>callfloor)
		    		group[callLift].lowestCall=callfloor;
		    	setState(callLift,callfloor);
	}
	 
	 
	 //设定状态函数
	 /***********************************************/ 
     public  void setState(int callLift,int callfloor){
    	    int floor=group[callLift].floor;
		    if(floor==numOfFloor||floor==1)
		    	group[callLift].state=FREE;
		    
		    if(group[callLift].toppestCall>numOfFloor||group[callLift].lowestCall==0){
	 		    group[callLift].state=FREE;
	 		}else if(group[callLift].state==FREE){
	    		if(group[callLift].toppestCall<floor){
	    			group[callLift].state=GODOWN;
				}else if(group[callLift].toppestCall>floor){
					group[callLift].state=GOUP;
			    }else{
			    	/*group[callLift].upStop[floor]=group[callLift].downStop[floor]=0;

			    	
			    	//#################upCalls test
	    		      upCalls[floor]=0;
//	    		    #################downCalls test
	    		      downCalls[floor]=0;
			    
                    setUpButtonBlack(floor);
			    	
			    	
			    	
			    	setDownButtonBlack(floor);*/
			    	group[callLift].cageTimer.stop();
			    	if(group[callLift].upStop[floor]==1){
			    		group[callLift].state=GOUP;
			    		group[callLift].upStop[floor]=0;
			    		upCalls[floor]=0;
			    		setUpButtonBlack(floor);
			    	}
			    	if(group[callLift].downStop[floor]==1){
			    		group[callLift].state=GODOWN;
			    		group[callLift].downStop[floor]=0;
			    		downCalls[floor]=0;
			    		setDownButtonBlack(floor);
			    	}
			    	group[callLift].gateTimer.start();
			    	group[callLift].ifOpen=true; 
			      }
			}else if(group[callLift].state==GOUP){
	    		if(floor>group[callLift].toppestCall){
	    			group[callLift].state=GODOWN;
/****/	    	}
	    	}else if(group[callLift].state==GODOWN){
	    		if(floor<group[callLift].lowestCall)
	    			group[callLift].state=GOUP;
	    	}
	    	
	    	
	 }	
	 
     
     
     //每次关门后检测状态
	 /**********************************************/
	void searchToppestLowest(int callLift){
		
		 int t=callLift;
		 for(int i=numOfFloor;i>0;i--){
			 if(group[t].stop[i]==1||group[t].upStop[i]==1||group[t].downStop[i]==1){
				 group[t].toppestCall=i;
				 break;
			 }else{
				 group[t].toppestCall=10000;
			 }

⌨️ 快捷键说明

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