JAVA小程序开发之模拟电梯APP(代码优化)

今年1月,自己独立弄了个模拟电梯APP,由于当时写的时间仓促,一些代码命名、注释和行间距,没有好好控制,除了自己别人很难看得懂。 

下午难得有时间,于是把这些缺陷统统优化了一遍,这也是在告诉自己,以后写代码时,一定得规范,让别人能容易看得懂,总之,勉励自己写出高质量的代码!

package com.sinolife.icms.grp.test;

import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;  

/**
 * Init add on 20140105
 * @author Mars
 * 
 * Modified by Mars on 20140309, target: Code and Conments Enhancement
 *
 */
public class SimulatedElevator {
	
	public static void main(String[] args){
	
		seFrame seFrame = new seFrame();
		seFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		seFrame.setVisible(true); 
	}
}

class RunElevator implements Runnable{
	
	private Elevator elevator;
	private Component component;
	
	public RunElevator(Elevator elevator,Component component){
		
		this.elevator = elevator;
		this.component = component;
	}
 
	public void run(){
		
		while (true){
		
			try {
			
				elevator.move();
				component.repaint();
				
				if(elevator.currentFloor == 1){
					elevator.isAllowRunInSide = true;
				}
				
				Iterator iteratorOut = elevator.arrayClickOutSide.iterator(); 
				int k;
				
				while(iteratorOut.hasNext()){
				
					k = (Integer) iteratorOut.next(); 
					
					if(elevator.currentDistance == k){
						elevator.isRun = false;
					} 
				}
				
				Iterator iteratorIn = elevator.arrayClickInSide.iterator();  
				
				while(iteratorIn.hasNext()){
				
					k = (Integer) iteratorIn.next();  
					
					if(elevator.currentDistance == k){
					
						elevator.isRun = false;
						iteratorIn.remove();
						elevator.isAllowRunInSide = true;
					}
				}
				
				Iterator iteratorRunning = elevator.arrayClickRunning.iterator();  
				
				while(iteratorRunning.hasNext()){
				
					k = (Integer) iteratorRunning.next(); 
					
					if(elevator.currentDistance == k){
						elevator.isRun = false;
						iteratorRunning.remove();
					}
					
				}
				
				// 电梯每0.5秒移动一次
				Thread.sleep(elevator.speed);
			} 
			catch (Exception e){
			
			}
		}
	}
}

class StatusRunnable implements Runnable{ 
	
	private JLabel labFloor;
	private JLabel labStatus;
	private Elevator elevator;
	
	public StatusRunnable(Elevator elevator,JLabel labFloor,JLabel labStatus){
	
		this.labFloor = labFloor;
		this.labStatus = labStatus;
		this.elevator = elevator;
	}
	public void run(){
		
		String status = "";
		
		while(true){
			
			switch(elevator.derection){
			case 2:
				status = "向   上";
				break;
			case 4:
				status = "向   下";
				break;
			default:
				status = "向   上";
				break;
			}
			if(elevator.isRun == false){
				status = "停   止";
			}
			
			labStatus.setText(status);	
			labFloor.setText("" + elevator.currentFloor);
		}
	}
}
 
class Elevator{
	
	protected boolean isRun; 
	protected ArrayList<Node> body; 
	protected Set arrayClickOutSide;
	protected Set arrayClickInSide;
	protected Set arrayClickRunning;
	protected Node food; 
	protected int derection; 
	protected int score;
	protected int status;
	protected int speed;
	protected int distance;
	protected int currentFloor;
	protected int targetFloor;
	protected int interrupDistance;
	protected int currentDistance;
	public static final int SLOW = 500;
	public static final int MID = 300;
	public static final int FAST = 100;
	public static final int RUNNING = 1;
	public static final int PAUSED = 2;
	public static final int GAMEOVER = 3;
	public static final int UP = 2;
	public static final int DOWN = 4;
	public static final int FLOOR_1 = 1;
	public static final int FLOOR_2 = 2;
	public static final int FLOOR_3 = 3;
	public static final int FLOOR_4 = 4;
	public static final int FLOOR_5 = 5;
	public static final int FLOOR_6 = 6;
	boolean isTurnDown;
	boolean isTurnUp;
	boolean isFirstMoving;
	boolean isClick;
	boolean isAllowRunOutSide;
	boolean isAllowRunInSide;
	boolean isInterrupt;
	boolean isClickInside;
	boolean isClickClose;
	protected String moveStatus;
	
	public Elevator(){
		
		speed = Elevator.SLOW;
		score = 0;
		isRun = false;
		status = Elevator.PAUSED;
		derection = Elevator.UP;
		distance = 460;// 初始距离
	    isTurnDown = true;// 是否向下移动
		isTurnUp = true;// 是否向上移动
		isFirstMoving = true;// 首次移动
		isClick = true;
		isAllowRunOutSide =  false;
		isAllowRunInSide =  true;
		isInterrupt = false;
		isClickInside = false;
		isClickClose = false;
		moveStatus = "free";
		targetFloor = 1;
		currentFloor = 1;
		currentDistance = 480;
		interrupDistance = 0;
		arrayClickOutSide = new TreeSet();
		arrayClickInSide = new TreeSet();
		arrayClickRunning = new TreeSet();
		
		// 初始化电梯厢,由四块组成
		body = new ArrayList<Node>();
		body.add(new Node(0,400));
		body.add(new Node(0,420));
		body.add(new Node(0,440));
		body.add(new Node(0,460)); 
	}
 
	public synchronized void move(){
		
		 // 电梯运行状态控制
		 if(isRun){ 
		
			Node node = body.get(0);
			int X = node.x;
			int Y = node.y;
			
			// derection == 2向上运行,否则向下运行
			if(derection == 2){
			
				moveStatus = "UP";
				isTurnUp = true;
				if(isFirstMoving){
					
					Y -= Node.H;
				}else{
					if(isTurnDown){
					
						body.clear();
						body.add(new Node(0,Y-60));
						body.add(new Node(0,Y-40));
						body.add(new Node(0,Y-20));
						body.add(new Node(0,Y)); 
						node = body.get(0);
						isTurnDown = false;
					}else{
						
						node = body.get(0);
					}
					
					Y = node.y;
					System.out.println(Y+"  Y===.");
					Y -= Node.H;
				}
				
			}else{
				
				moveStatus = "DOWN";
				isFirstMoving = false;
				isTurnDown = true;
				
				if(isTurnUp){
				
					body.clear();
					body.add(new Node(0,Y+60));
					body.add(new Node(0,Y+40));
					body.add(new Node(0,Y+20));
					body.add(new Node(0,Y)); 
					node = body.get(0);
					isTurnUp = false;
				}else{
					
					node = body.get(0);
				}
				
				Y = node.y;
				Y += Node.H;
			}
			
			// 根据运行距离,显示牌显示当前电梯所在楼层数
			switch(Y){
				
				case 480:
					currentFloor = 1;
					break;
				case 380:
					currentFloor = 2;
					break;
				case 360:
					currentFloor = 2;
					break;
				case 340:
					currentFloor = 2;
					break;
				case 320:
					currentFloor = 2;
					break;
				case 300:
					currentFloor = 3;
					break;
				case 280:
					currentFloor = 3;
					break;
				case 260:
					currentFloor = 3;
					break;
				case 240:
					currentFloor = 3;
					break;
				case 220:
					currentFloor = 4;
					break;
				case 200:
					currentFloor = 4;
					break;
				case 180:
					currentFloor = 4;
					break;
				case 160:
					currentFloor = 4;
					break;
				case 140:
					currentFloor = 5;
					break;
				case 120:
					currentFloor = 5;
					break;
				case 100:
					currentFloor = 5;
					break;
				case 80:
					currentFloor = 5;
					break;
				case 60:
					currentFloor = 6;
					break;
				case 40:
					currentFloor = 6;
					break;
				case 20:
					currentFloor = 6;
					break;
				case 0:
					currentFloor = 6;
					break;
			}
			
			System.out.println("电梯目前所在楼层,第  "+currentFloor+" 层");
			currentDistance = Y;
			body.add(0,new Node(X,Y));
			body.remove(body.size() - 1);
			
			//判断电梯运行轨迹与控制值相同,否则电梯停止运行
			if(Y == distance){
				
				isClick = true;
				isRun = false;
				currentFloor = targetFloor;
				isAllowRunOutSide = false; 
				arrayClickOutSide.clear();
				arrayClickInSide.clear();
			}
		 }
	}
}

class Node{
	
	protected static final int W = 80;
	protected static final int H = 20;
	int x;
	int y;
	
	public Node(int x,int y){
		
		this.x = x;
		this.y = y;
	}
} 

class ElevatorPanel extends JPanel{
	
	Elevator elevator;
	
	public ElevatorPanel(Elevator elevator){
		
		this.elevator = elevator;
	}
	
	public void paintComponent(Graphics g){
		
		super.paintComponent(g);

		/**
		 * 电梯本体
		 * 这里相当于画四(elevator.body.size())块蛇本身,3*20*20
		 */
		Node node = null;
		g.setColor(Color.ORANGE);
	
		for(int i = 0;i < elevator.body.size();i++){
		
			node = elevator.body.get(i);
			g.fillRect(node.x, node.y, node.W, node.H); 
		}
	}
}

class seFrame extends JFrame{

	private JButton btnUp1F;// 一层电梯呼叫按钮-上
	private JButton btnDown1F;// 一层电梯呼叫按钮-下
	private JButton btnUp2F;// 二层电梯呼叫按钮-上
	private JButton btnDown2F;// 二层电梯呼叫按钮-下
	private JButton btnUp3F;// 三层电梯呼叫按钮-上
	private JButton btnDown3F;// 三层电梯呼叫按钮-下
	private JButton btnUp4F;// 四层电梯呼叫按钮-上
	private JButton btnDonw4F;// 四层电梯呼叫按钮-下
	private JButton btnUp5F;// 五层电梯呼叫按钮-上
	private JButton btnDown5F;// 五层电梯呼叫按钮-下
	private JButton btnUp6F;// 六层电梯呼叫按钮-上
	private JButton btnDown6F;// 六层电梯呼叫按钮-下
	private JButton btnNum1;// 电梯内按钮号码-1
	private JButton btnNum2;// 电梯内按钮号码-2
	private JButton btnNum3;// 电梯内按钮号码-3
	private JButton btnNum4;// 电梯内按钮号码-4
	private JButton btnNum5;// 电梯内按钮号码-5
	private JButton btnNum6;// 电梯内按钮号码-6
	private JButton btnClose;// 电梯内关门按钮-关门
	private JLabel lab1F;// 各楼层数字-1
	private JLabel lab2F;// 各楼层数字-2
	private JLabel lab3F;// 各楼层数字-3
	private JLabel lab4F;// 各楼层数字-4
	private JLabel lab5F;// 各楼层数字-5
	private JLabel lab6F;// 各楼层数字-6
	private JLabel labDisplay;// 显示牌
	private JLabel labFloor;// 显示牌-楼层
	private JLabel labStatus;// 显示牌-状态(上或下)
	private Elevator elevator;// 电梯
	
	public seFrame(){
		
		// 页面对象初始化
		init();
		
		// 动作监控,响应方法
		ActionListener seActionListener = new ActionListener(){
			
			public void actionPerformed(ActionEvent e){
				
				Node node = elevator.body.get(0);
				
				if(e.getSource() == btnUp1F){
					
					if(elevator.arrayClickInSide.size() != 0){
						
						elevator.isAllowRunOutSide = true;
					}
			
					if(elevator.isAllowRunOutSide){
						
						// 校验电梯与触发事件为同一层楼
						if(node.y == 400 || node.y == 460){
		
							elevator.isRun = false;
						}else{
							
							elevator.isRun = true;
							elevator.isAllowRunOutSide = false;
							elevator.derection = Elevator.DOWN; 
							elevator.distance = 460;
							elevator.targetFloor = 1;
						}
					}
				}
				
				if(e.getSource() == btnUp2F){
					
					if(elevator.arrayClickInSide.size() != 0){
				
						elevator.arrayClickRunning.clear();
						elevator.arrayClickOutSide.add(320);
					}else{
						
						if(elevator.isAllowRunOutSide){
							
							// 校验电梯与触发事件为同一层楼
							if(node.y == 380 || node.y == 320){
							
								elevator.isRun = false;
							}else{
								
								if(elevator.isClick && elevator.targetFloor > 2){
								
									elevator.derection = Elevator.DOWN;
									elevator.isClick = false;
									elevator.distance = 380;
								}else{
									
									elevator.derection = Elevator.UP; 
									elevator.distance = 320;
								}
						
								elevator.isRun = true;
								elevator.isAllowRunOutSide = false;
								elevator.targetFloor = 2;
							}
						}
						// 电梯外按钮点击数累加
						if(elevator.targetFloor >= 2 && elevator.currentFloor <= 2
								&& elevator.distance < 320){
							
							elevator.arrayClickOutSide.add(320);
						}
					}
				}
				if(e.getSource() == btnDown2F){
					
					if(elevator.arrayClickInSide.size() != 0){
						
						elevator.arrayClickRunning.clear();
						elevator.arrayClickOutSide.add(380);
					}else{
						if(elevator.isAllowRunOutSide){
							
							// 校验电梯与触发事件为同一层楼
							if(node.y == 380 || node.y == 320){
						
								elevator.isRun = false;
							}else{
								
								if(elevator.isClick && elevator.targetFloor < 2){
								
									elevator.derection = Elevator.UP;
									elevator.isClick = false;
									elevator.distance = 320;
								}else{
									
									elevator.derection = Elevator.DOWN; 
									elevator.distance = 380;
								}
								
								elevator.isRun = true;
								elevator.isAllowRunOutSide = false;
								elevator.targetFloor = 2;
							}
						}
						// 电梯外按钮点击数累加
						if(elevator.targetFloor <= 2 && elevator.currentFloor >= 2
								&& elevator.distance > 380){
					
							elevator.arrayClickOutSide.add(380);
						}
					}
				}
				if(e.getSource() == btnUp3F){
					
					if(elevator.arrayClickInSide.size() != 0){
					
						elevator.arrayClickRunning.clear();
						elevator.arrayClickRunning.add(240);
					}
					if(elevator.isAllowRunOutSide){
						
						// 校验电梯与触发事件为同一层楼
						if(node.y == 300 || node.y == 240){
						
							elevator.isRun = false;
						}else{
							if(elevator.isClick && elevator.targetFloor > 3){
							
								elevator.derection = Elevator.DOWN;
								elevator.isClick = false;
								elevator.distance = 300;
							}else{
								
								elevator.derection = Elevator.UP; 
								elevator.distance = 240;
							}
							
							elevator.isRun = true;
							elevator.isAllowRunOutSide = false;
							elevator.targetFloor = 3;
						}
					}
					// 电梯外按钮点击数累加
					if(elevator.targetFloor >= 3 && elevator.currentFloor <= 3
							&& elevator.distance < 240){
						
						elevator.arrayClickOutSide.add(240);
					}
				}
				if(e.getSource() == btnDown3F){
					
					if(elevator.arrayClickInSide.size() != 0){
						
						elevator.arrayClickRunning.clear();
						elevator.arrayClickRunning.add(300);
					}
					if(elevator.isAllowRunOutSide){
						
						//校验电梯与触发事件为同一层楼
						if(node.y == 300 || node.y == 240){
						
							elevator.isRun = false;
						}else{
							if(elevator.isClick && elevator.targetFloor < 3){
							
								elevator.derection = Elevator.UP;
								elevator.isClick = false;
								elevator.distance = 240;
							}else{
								
								elevator.derection = Elevator.DOWN; 
								elevator.distance = 300;
							}
							
							elevator.isRun = true;
							elevator.isAllowRunOutSide = false;
							elevator.targetFloor = 3;
						}
					}
					//电梯外按钮点击数累加
					if(elevator.targetFloor <= 3 && elevator.currentFloor >= 3
							&& elevator.distance > 300){
						
						elevator.arrayClickOutSide.add(300);
					}
				}
				if(e.getSource() == btnUp4F){
					
					if(elevator.arrayClickInSide.size() != 0){
					
						elevator.arrayClickRunning.clear();
						elevator.arrayClickRunning.add(160);
					}
					if(elevator.isAllowRunOutSide){
						
						//校验电梯与触发事件为同一层楼
						if(node.y == 160 || node.y == 220){
							elevator.isRun = false;
						}else{
							if(elevator.isClick && elevator.targetFloor > 4){
						
								elevator.derection = Elevator.DOWN;
								elevator.isClick = false;
								elevator.distance = 220;
							}else{
								
								elevator.derection = Elevator.UP; 
								elevator.distance = 160;
							}
							
							elevator.isRun = true;
							elevator.isAllowRunOutSide = false;
							elevator.targetFloor = 4;
						}
					}
					//电梯外按钮点击数累加
					if(elevator.targetFloor >= 4 && elevator.currentFloor <= 4
							&& elevator.distance < 160){
						
						elevator.arrayClickOutSide.add(160);
					}
				}
				if(e.getSource() == btnDonw4F){
					
					if(elevator.arrayClickInSide.size() != 0){
						
						elevator.arrayClickRunning.clear();
						elevator.arrayClickRunning.add(220);
					}
					if(elevator.isAllowRunOutSide){
						
						//校验电梯与触发事件为同一层楼
						if(node.y == 160 || node.y == 220){
						
							elevator.isRun = false;
						}else{
							
							if(elevator.isClick && elevator.targetFloor < 4){
							
								elevator.derection = Elevator.UP;
								elevator.isClick = false;
								elevator.distance = 160;
							}else{
								
								elevator.derection = Elevator.DOWN; 
								elevator.distance = 220;
							}
							
							elevator.isRun = true;
							elevator.isAllowRunOutSide = false;
							elevator.targetFloor = 4;
						}
					}
					//电梯外按钮点击数累加
					if(elevator.targetFloor <= 4 && elevator.currentFloor >= 4
							&& elevator.distance > 220){
						
						elevator.arrayClickOutSide.add(220);
					}
				}
				if(e.getSource() == btnUp5F){
					
					if(elevator.arrayClickInSide.size() != 0){
						
						elevator.arrayClickRunning.clear();
						elevator.arrayClickOutSide.add(80);
					}
					if(elevator.isAllowRunOutSide){
						
						//校验电梯与触发事件为同一层楼
						if(node.y == 80 || node.y == 140){
						
							elevator.isRun = false;
						}else{
							if(elevator.isClick && elevator.targetFloor > 5){
							
								elevator.derection = Elevator.DOWN;
								elevator.isClick = false;
								elevator.distance = 140;
							}else{
								
								elevator.derection = Elevator.UP; 
								elevator.distance = 80;
							}
							
							elevator.isRun = true;
							elevator.isAllowRunOutSide = false;
							elevator.targetFloor = 5;
						}
					}
					//电梯外按钮点击数累加
					if(elevator.targetFloor >= 5 && elevator.currentFloor <= 5
							&& elevator.distance < 80){
						
						elevator.arrayClickOutSide.add(80);
					}
				}
				if(e.getSource() == btnDown5F){
					
					if(elevator.arrayClickInSide.size() != 0){
						
						elevator.arrayClickRunning.clear();
						elevator.arrayClickOutSide.add(140);
					}
					if(elevator.isAllowRunOutSide){
						
						//校验电梯与触发事件为同一层楼
						if(node.y == 80 || node.y == 140){
						
							elevator.isRun = false;
						}else{
							if(elevator.isClick && elevator.targetFloor < 5){
							
								elevator.derection = Elevator.UP;
								elevator.isClick = false;
								elevator.distance = 80;
							}else{
								
								elevator.derection = Elevator.DOWN; 
								elevator.distance = 140;
							}
							
							elevator.isRun = true;
							elevator.isAllowRunOutSide = false;
							elevator.targetFloor = 5;
						}
					}
					//电梯外按钮点击数累加
					if(elevator.targetFloor <= 5 && elevator.currentFloor >= 5
							&& elevator.distance > 140){
						
						elevator.arrayClickOutSide.add(140);
					}

				}
				if(e.getSource() == btnDown6F){
					
					if(elevator.arrayClickInSide.size() != 0){
						
						elevator.arrayClickRunning.clear();
						elevator.isAllowRunOutSide = true;
					}
					if(elevator.isAllowRunOutSide){
						
						//校验电梯与触发事件为同一层楼
						if(node.y == 0){
						
							elevator.isRun = false;
						}else{
							
							elevator.isRun = true;
							elevator.isAllowRunOutSide = false;
							elevator.derection = Elevator.UP; 
							elevator.distance = 0;
							elevator.targetFloor = 6;
						}
					}
				}
				if(e.getSource() == btnNum1){
					if(elevator.isAllowRunInSide){
						if(elevator.currentFloor > 1){
							
							elevator.derection = Elevator.DOWN;
							elevator.arrayClickInSide.add(460);
							elevator.isAllowRunInSide = false;
							elevator.isAllowRunOutSide = false;
							elevator.targetFloor = 1;
						}
					}
				}
				if(e.getSource() == btnNum2){
					
					if(elevator.isAllowRunInSide){
						if(elevator.currentFloor != 2){
							if(elevator.currentFloor < 2){
							
								elevator.derection = Elevator.UP;
								elevator.arrayClickInSide.add(320);
							}else{
								
								elevator.derection = Elevator.DOWN;
								elevator.arrayClickInSide.add(380);
							}
							
							elevator.isAllowRunInSide = false;
							elevator.isAllowRunOutSide = false;
							elevator.targetFloor = 2;
						}
					}
				}
				if(e.getSource() == btnNum3){ 
					if(elevator.isAllowRunInSide){
						if(elevator.currentFloor != 3){
							if(elevator.currentFloor < 3){
							
								elevator.derection = Elevator.UP;
								elevator.arrayClickInSide.add(240);
							}else{
								
								elevator.derection = Elevator.DOWN;
								elevator.arrayClickInSide.add(300);
							}
							
							elevator.isAllowRunInSide = false;
							elevator.isAllowRunOutSide = false;
							elevator.targetFloor = 3;
						}
					}
				}
				if(e.getSource() == btnNum4){
					if(elevator.isAllowRunInSide){
						if(elevator.currentFloor != 4){
							if(elevator.currentFloor < 4){
							
								elevator.derection = Elevator.UP;
								elevator.arrayClickInSide.add(160);
							}else{
								
								elevator.derection = Elevator.DOWN;
								elevator.arrayClickInSide.add(220);
							}
							
							elevator.isAllowRunInSide = false;
							elevator.isAllowRunOutSide = false;
							elevator.targetFloor = 4;
						}
					} 
				}
				if(e.getSource() == btnNum5){
					if(elevator.isAllowRunInSide){
						if(elevator.currentFloor != 5){
							if(elevator.currentFloor < 5){
							
								elevator.derection = Elevator.UP;
								elevator.arrayClickInSide.add(80);
							}else{
								
								elevator.derection = Elevator.DOWN;
								elevator.arrayClickInSide.add(140);
							}
							
							elevator.isAllowRunInSide = false;
							elevator.isAllowRunOutSide = false;
							elevator.targetFloor = 5;
						}
					} 
				}	
				if(e.getSource() == btnNum6){
					if(elevator.isAllowRunInSide){
						if(elevator.currentFloor < 6){
							
							elevator.derection = Elevator.UP;
							elevator.arrayClickInSide.add(0);
							elevator.isAllowRunInSide = false;
							elevator.isAllowRunOutSide = false;
							elevator.targetFloor = 6;
						}
					} 
				}
				if(e.getSource() == btnClose){
					
					if(elevator.arrayClickInSide.size() != 0){
						
						//当前电梯停靠楼层与目标楼层相同,此操作无效
						if(elevator.currentFloor == elevator.targetFloor){
							
							elevator.isRun = false;
						}else{
							
							elevator.isRun = true;
							elevator.isAllowRunInSide = false;
						}
					}else{
						
						elevator.isAllowRunOutSide = true;
					}
					
					if(elevator.arrayClickOutSide.size() != 0){
						
						elevator.isRun = true;
					}
				} 
			}
		};
		
		// 监控页面上所有的动作,系统需要监控状态,得以响应动作
		btnUp1F.addActionListener(seActionListener);
		btnDown1F.addActionListener(seActionListener);
		btnUp2F.addActionListener(seActionListener);
		btnDown2F.addActionListener(seActionListener);
		btnUp3F.addActionListener(seActionListener);
		btnDown3F.addActionListener(seActionListener);
		btnUp4F.addActionListener(seActionListener);
		btnDonw4F.addActionListener(seActionListener);
		btnUp5F.addActionListener(seActionListener);
		btnDown5F.addActionListener(seActionListener);
		btnUp6F.addActionListener(seActionListener);
		btnDown6F.addActionListener(seActionListener);
		btnNum1.addActionListener(seActionListener);
		btnNum2.addActionListener(seActionListener);
		btnNum3.addActionListener(seActionListener);
		btnNum4.addActionListener(seActionListener);
		btnNum5.addActionListener(seActionListener);
		btnNum6.addActionListener(seActionListener);
		btnClose.addActionListener(seActionListener); 
	}
	private void init(){
		
		// 窗口设置
		setTitle("SimulatedElvetor (SE) 1.1");
		setSize(400,530);
		setLayout(null);
		setResizable(false);
		
		// 各楼层位置数字
		lab1F = new JLabel(" 1");
		lab1F.setBounds(85,405,20,80);
		lab1F.setBorder(BorderFactory.createLineBorder(Color.blue));
		add(lab1F);
		lab2F = new JLabel(" 2");
		lab2F.setBounds(85,325,20,80);
		lab2F.setBorder(BorderFactory.createLineBorder(Color.blue));
		add(lab2F);
		lab3F = new JLabel(" 3");
		lab3F.setBounds(85,245,20,80);
		lab3F.setBorder(BorderFactory.createLineBorder(Color.blue));
		add(lab3F);
		lab4F = new JLabel(" 4");
		lab4F.setBounds(85,165,20,80);
		lab4F.setBorder(BorderFactory.createLineBorder(Color.blue));
		add(lab4F);
		lab5F = new JLabel(" 5");
		lab5F.setBounds(85,85,20,80);
		lab5F.setBorder(BorderFactory.createLineBorder(Color.blue));
		add(lab5F);
		lab6F = new JLabel(" 6");
		lab6F.setBounds(85,5,20,80);
		lab6F.setBorder(BorderFactory.createLineBorder(Color.blue));
		add(lab6F);	
		
		// 各层楼梯呼叫按钮设置
	    btnUp6F = new JButton("上");
		btnUp6F.setBounds(105, 5, 50, 40);
		btnUp6F.setEnabled(false);
		add(btnUp6F);
		btnDown6F = new JButton("下");
		btnDown6F.setBounds(105, 45, 50, 40);
		add(btnDown6F);
		btnUp5F = new JButton("上");
		btnUp5F.setBounds(105, 85, 50, 40);
		add(btnUp5F);
		btnDown5F = new JButton("下");
		btnDown5F.setBounds(105, 125, 50, 40);
		add(btnDown5F);
		btnUp4F = new JButton("上");
		btnUp4F.setBounds(105, 165, 50, 40);
		add(btnUp4F);
		btnDonw4F = new JButton("下");
		btnDonw4F.setBounds(105, 205, 50, 40);
		add(btnDonw4F);
		btnUp3F = new JButton("上");
		btnUp3F.setBounds(105, 245, 50, 40);
		add(btnUp3F);
		btnDown3F = new JButton("下");
		btnDown3F.setBounds(105, 285, 50, 40);
		add(btnDown3F);
		btnUp2F = new JButton("上");
		btnUp2F.setBounds(105, 325, 50, 40);
		add(btnUp2F);
		btnDown2F = new JButton("下");
		btnDown2F.setBounds(105, 365, 50, 40);
		add(btnDown2F);
		btnUp1F = new JButton("上");
		btnUp1F.setBounds(105, 405, 50, 40);
		add(btnUp1F);
		btnDown1F = new JButton("下");
		btnDown1F.setBounds(105, 445, 50, 40);
		btnDown1F.setEnabled(false);
		add(btnDown1F);
		
		// 电梯内的楼层按钮区域
		btnNum1 = new JButton("1");
		btnNum1.setBounds(200, 360, 45, 30);
		add(btnNum1);
		btnNum2 = new JButton("2");
		btnNum2.setBounds(245, 360, 45, 30);
		add(btnNum2);
		btnNum3 = new JButton("3");
		btnNum3.setBounds(290, 360, 45, 30);
		add(btnNum3);
		btnNum4 = new JButton("4");
		btnNum4.setBounds(200, 390, 45, 30);
		add(btnNum4);
		btnNum5 = new JButton("5");
		btnNum5.setBounds(245, 390, 45, 30);
		add(btnNum5);
		btnNum6 = new JButton("6");
		btnNum6.setBounds(290, 390, 45, 30);
		add(btnNum6);
		btnClose = new JButton("关门");
		btnClose.setBounds(200, 330, 135, 30);
		add(btnClose); 
		
		// 创建电梯
		JPanel panElevator = new JPanel();
		elevator = new Elevator();
		panElevator = new ElevatorPanel(elevator);
		panElevator.setBounds(5,5,80,480);
		panElevator.setBorder(BorderFactory.createLineBorder(Color.darkGray));
		
		// 显示牌
		labDisplay = new JLabel(" 显   示   牌");
		labDisplay.setBounds(200,200,90,30);
		labDisplay.setBorder(BorderFactory.createLineBorder(Color.blue));
		add(labDisplay); 
		
		// 显示当前所在层数
		labFloor = new JLabel();
		labFloor.setBounds(200,231,90,30);
		labFloor.setBorder(BorderFactory.createLineBorder(Color.blue));
		add(labFloor); 
		
		// 电梯运行状态
		labStatus = new JLabel();
		labStatus.setBounds(200,262,90,30);
		labStatus.setBorder(BorderFactory.createLineBorder(Color.blue));
		add(labStatus); 
		
		// 电梯运行添加多线程控制
		Runnable runElevator = new RunElevator(elevator,panElevator);
		Thread thrElevator = new Thread(runElevator);
		thrElevator.start();
		
		// 显示牌添加多线程控制
		Runnable runStatus = new StatusRunnable(elevator,labFloor,labStatus);
		Thread thrStatus = new Thread(runStatus);
		thrStatus.start();
		
		add(panElevator);
	}
}
 


  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
用面向对象方法和面向对象程序设计语言,实现满足下述要求的一个高层建筑电梯活动 仿真程序。 问题域概述 某国际展览中心共 40 层,设有载客电梯10 部(用E0~E9 标识)。 限定条件 (1) 电梯的运行规则是: E0、E1:可到达每层。 E2、E3:可到达1、25~40 层。 E4、E5:可到达1~25 层。 E6、E7:可到达1、2~40 层中的偶数层。 E8、E9:可到达1~39 层中的奇数层。 (2) 每部电梯的最大乘员量均为K 人(K 值可以根据仿真情况在10~18 人之间确定)。 (3) 仿真开始时,各电梯随机地处于其符合运行规则的任意一层,为空梯。 (4) 仿真开始后,有N 人(0<N<1000)在M 分钟(0<M<10)内随机地到达该国际 展览中心的1 层,开始乘梯活动。 (5) 每位乘客初次所要到达的楼层是随机的,令其在合适的电梯处等待电梯到来。 (6) 每位乘客乘坐合适的电梯到达指定楼层后,随机地停留10-120 秒后,再随机 地去往另一楼层,依此类推,当每人乘坐过L 次(每人的L 值不同,在产生乘客时随机地 在1~10 次之间确定)电梯后,第L+1 次为下至底层并结束乘梯行为。到所有乘客结束乘梯 行为时,本次仿真结束。 (7) 电梯运行速度为S 秒/层(S 值可以根据仿真情况在1~5 之间确定),每人上下时 间为T 秒(T 值可以根据仿真情况在2~10 之间确定)。 (8) 电梯运行的方向由先发出请求者决定,不允许后发出请求者改变电梯的当前运 行方向,除非是未被请求的空梯。 (9) 当某层有乘客按下乘梯电钮时,优先考虑离该层最近的、满足条件(8)、能够 最快到达目标层的电梯。 (10) 不允许电梯超员。 开发结果的行为特征 (1) 产生事件的周期为1 秒,每次可产生0 个或多个事件。 (2) 各随机事件由互不相关的伪随机数发生器决定。 (3) 设计一个易于理解的界面,动态显示各梯的载客与运行情况,动态显示各楼层 的人员停留情况与要求乘梯情况;动态显示从仿真开始到目前的时间。 (4) 显示时用应表示出不同的乘客及其当前所要求去往的楼层。例如,12-32 表示标 识为12 的乘客要求去往32 层。 (5) 统计各梯的运行与空闲时间;统计各人发出乘梯要求后的等待时间;仿真结束 后显示这些时间。 (6) 参数K、N、M、S、T 应从命令行输入。 (7) (选做)考虑有些乘客(随机决定)携带的物品体积较大,需占用1~2 人的电 梯空间(随机决定),且上下梯的时间比其他乘客长一倍的情况,再进行相应的仿真(注意, 不是所有的乘客都携带较大体积的物品)。这时,显示乘客及所去往的楼层时要能够识别出 是否携带了较大体积的物品。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值