JAVA小程序開發之模擬電梯APP (源碼詳解)

程序名稱:模擬電梯系統

編碼時間:30-40個小時

參與人數:兩個

各自職責:zhidao(需求分析),Mars(編碼)

操作平臺:win7

編程語言:java swing

開發工具:Eclipse(Helios Service Release 1)

開發目的:業餘時間自我技能提升,通過嘗試不同的開發風格,掌握不同的開發技巧。還有與其他非工作夥伴共同開發,學會與不同類型夥伴交流。總之,主動提高對編程的瞭解,一切爲了在工作中能有更好的發展。

開發意義:不斷提升自己,超越自己。

開發理由:我經常會每天乘坐着電梯上下班,對電梯內部的實現原理尤其好奇,這是什麼樣的原理?我至少知道里面肯定是用到多線程知識,爲了那份好奇之心,我決定模擬一個小程序,滿足我的好奇之心。



項目簡介:

此項目模擬我們日常乘坐電梯的摸樣與實現原理,考慮到實現的複雜原因,我只是實現了一些簡單的功能。電梯一臺,樓層6層,每層樓有上下兩個按鈕(1層與6層只有一個),電梯內有7個按鈕(1個關門,6個各樓層位置按鈕),顯示牌一塊(記錄當前樓層與電梯運行狀態)。

此係統模擬的畫面,比較抽象,不過最關鍵是內部的實現思路。


鄙人把所有代碼貢獻出來,只希望看過的讀者,能給本人一點小建議。源碼如下:

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.Timer;
import java.util.TimerTask;
import java.util.TreeSet;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;  
/**
 * Add on 20140105
 * @author Mars
 *
 */
public class SimulatedElevator {
	
	public static void main(String[] args){
		seFrame frame = new seFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true); 
	}
}

class SnakeRunnable implements Runnable{
	private Snake snake;
	private Component component;
	
	public SnakeRunnable(Snake snake,Component component){
		this.snake = snake;
		this.component = component;
	}
 
	public void run(){
		while (true){
			try {
				snake.move();
				component.repaint();
				
				if(snake.currentFloor == 1){
					snake.isAllowRunInSide = true;
				}
				
				Iterator iteratorOut = snake.arrayClickOutSide.iterator(); 
				int k;
				while(iteratorOut.hasNext()){
					k = (Integer) iteratorOut.next(); 
					
					if(snake.currentDistance == k){
						snake.isRun = false;
					} 
				}
				
				Iterator iteratorIn = snake.arrayClickInSide.iterator();  
				while(iteratorIn.hasNext()){
					k = (Integer) iteratorIn.next();  
					if(snake.currentDistance == k){
						snake.isRun = false;
						iteratorIn.remove();
						snake.isAllowRunInSide = true;
					}
				}
				
				Iterator iteratorRunning = snake.arrayClickRunning.iterator();  
				while(iteratorRunning.hasNext()){
					k = (Integer) iteratorRunning.next(); 
					if(snake.currentDistance == k){
						snake.isRun = false;
						iteratorRunning.remove();
					}
					
				}

/**				此方法爲電梯按定義時間關閉,因功能未完善先註釋,後續有時間再完善
 * 				if(snake.isRun == false && snake.isAllowRunOutSide == false 
						&& snake.arrayClickOutSide.size() == 0){
				    final Timer timer = new Timer();
				     
			    	 TimerTask tt=new TimerTask(){ 
				            public void run() {
				            	int s=1;
				                System.out.println("5秒內若無任何操作,電梯門將自動關閉 !  ");
				                snake.isAllowRunOutSide = true; 
				                timer.cancel();
			            	}
				        };
				        timer.schedule(tt, 5000);
				    
				}
 */
				
				//電梯每0.5秒移動一次
				Thread.sleep(snake.speed);
			} 
			catch (Exception e){
			}
		}
	}
}

class StatusRunnable implements Runnable{ 
	private JLabel floorLabel;
	private JLabel statusLabel;
	private Snake snake;
	
	public StatusRunnable(Snake snake,JLabel floorLabel,JLabel statusLabel){
		this.floorLabel = floorLabel;
		this.statusLabel = statusLabel;
		this.snake = snake;
	}
	public void run(){
		String status = "";
		
		while(true){
			switch(snake.derection){
			case 2:
				status = "向   上";
				break;
			case 4:
				status = "向   下";
				break;
			default:
				status = "向   上";
				break;
			}
			if(snake.isRun == false){
				status = "停   止";
			}
			statusLabel.setText(status);	
			floorLabel.setText("" + snake.currentFloor);
		}
	}
}
 
class Snake{
	boolean isRun; 
	ArrayList<Node> body; 
	Set arrayClickOutSide;
	Set arrayClickInSide;
	Set arrayClickRunning;
	Node food; 
	int derection; 
	int score;
	int status;
	int speed;
	int distance;
	int currentFloor;
	int targetFloor;
	int interrupDistance;
	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 LEEF = 1;
	public static final int UP = 2;
	public static final int RIGHT = 3;
	public static final int DOWN = 4;
	public static final int floor1 = 1;
	public static final int floor2 = 2;
	public static final int floor3 = 3;
	public static final int floor4 = 4;
	public static final int floor5 = 5;
	public static final int floor6 = 6;
	boolean isTurnDown;
	boolean isTurnUp;
	boolean isFirstMoving;
	boolean isClick;
	boolean isAllowRunOutSide;
	boolean isAllowRunInSide;
	boolean isInterrupt;
	boolean isClickInside;
	boolean isClickClose;
	String moveStatus;
	
	public Snake(){
		speed = Snake.SLOW;
		score = 0;
		isRun = false;
		status = Snake.PAUSED;
		derection = Snake.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("YY  "+Y);
			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{
	public static final int W = 80;
	public static final int H = 20;
	int x;
	int y;
	
	public Node(int x,int y){
		this.x = x;
		this.y = y;
	}
} 

class SnakePanel extends JPanel{
	Snake snake;
	
	public SnakePanel(Snake snake){
		this.snake = snake;
	}
	public void paintComponent(Graphics g){
		super.paintComponent(g);
		/**
		 * 電梯本體
		 * 這裏相當於畫四(snake.body.size())塊蛇本身,3*20*20
		 */
		Node node = null;
		g.setColor(Color.ORANGE);
		for(int i = 0;i < snake.body.size();i++){
			node = snake.body.get(i);
			g.fillRect(node.x, node.y, node.W, node.H); 
		}
	}
}

class seFrame extends JFrame{

	private JButton jb_1F_up;//各層按鈕
	private JButton jb_1F_down;//各層按鈕
	private JButton jb_2F_up;//各層按鈕
	private JButton jb_2F_down;//各層按鈕
	private JButton jb_3F_up;//各層按鈕
	private JButton jb_3F_down;//各層按鈕
	private JButton jb_4F_up;//各層按鈕
	private JButton jb_4F_down;//各層按鈕
	private JButton jb_5F_up;//各層按鈕
	private JButton jb_5F_down;//各層按鈕
	private JButton jb_6F_up;//各層按鈕
	private JButton jb_6F_down;//各層按鈕
	private JButton jb_num_1;//電梯內按鈕號碼-1
	private JButton jb_num_2;//電梯內按鈕號碼-2
	private JButton jb_num_3;//電梯內按鈕號碼-3
	private JButton jb_num_4;//電梯內按鈕號碼-4
	private JButton jb_num_5;//電梯內按鈕號碼-5
	private JButton jb_num_6;//電梯內按鈕號碼-6
	private JButton jb_close;//電梯內關門按鈕-關門
	private JButton jb_ok;//電梯內確認按鈕
	private JLabel jl_1F;//各樓層數字-1
	private JLabel jl_2F;//各樓層數字-2
	private JLabel jl_3F;//各樓層數字-3
	private JLabel jl_4F;//各樓層數字-4
	private JLabel jl_5F;//各樓層數字-5
	private JLabel jl_6F;//各樓層數字-6
	private JLabel displayLabel;//顯示牌
	private JLabel floorLabel;//顯示牌
	private JLabel statusLabel;//顯示牌
	private Snake snake;//電梯
	
	public seFrame(){
		
		//頁面各種對象初始化
		init();
		//動作監控,響應方法
		ActionListener l = new ActionListener(){
			public void actionPerformed(ActionEvent e){
				Node node = snake.body.get(0);
				if(e.getSource() == jb_1F_up){
					
					if(snake.arrayClickInSide.size() != 0){
						snake.isAllowRunOutSide = true;
					}
					if(snake.isAllowRunOutSide){
						
						//校驗電梯與觸發事件爲同一層樓
						if(node.y == 400 || node.y == 460){
							snake.isRun = false;
						}else{
							snake.isRun = true;
							snake.isAllowRunOutSide = false;
							snake.derection = Snake.DOWN; 
							snake.distance = 460;
							snake.targetFloor = 1;
						}
					}
				}
				if(e.getSource() == jb_2F_up){
					
					if(snake.arrayClickInSide.size() != 0){
						snake.arrayClickRunning.clear();
						snake.arrayClickOutSide.add(320);
					}else{
						if(snake.isAllowRunOutSide){
							
							//校驗電梯與觸發事件爲同一層樓
							if(node.y == 380 || node.y == 320){
								snake.isRun = false;
							}else{
								
								if(snake.isClick && snake.targetFloor > 2){
									snake.derection = Snake.DOWN;
									snake.isClick = false;
									snake.distance = 380;
								}else{
									snake.derection = Snake.UP; 
									snake.distance = 320;
								}
								snake.isRun = true;
								snake.isAllowRunOutSide = false;
								snake.targetFloor = 2;
							}
						}
						//電梯外按鈕點擊數累加
						if(snake.targetFloor >= 2 && snake.currentFloor <= 2
								&& snake.distance < 320){
							snake.arrayClickOutSide.add(320);
						}
					}
				}
				if(e.getSource() == jb_2F_down){
					
					if(snake.arrayClickInSide.size() != 0){
						snake.arrayClickRunning.clear();
						snake.arrayClickOutSide.add(380);
					}else{
						if(snake.isAllowRunOutSide){
							
							//校驗電梯與觸發事件爲同一層樓
							if(node.y == 380 || node.y == 320){
								snake.isRun = false;
							}else{
								
								if(snake.isClick && snake.targetFloor < 2){
									snake.derection = Snake.UP;
									snake.isClick = false;
									snake.distance = 320;
								}else{
									snake.derection = Snake.DOWN; 
									snake.distance = 380;
								}
								snake.isRun = true;
								snake.isAllowRunOutSide = false;
								snake.targetFloor = 2;
							}
						}
						//電梯外按鈕點擊數累加
						if(snake.targetFloor <= 2 && snake.currentFloor >= 2
								&& snake.distance > 380){
							snake.arrayClickOutSide.add(380);
						}
					}
				}
				if(e.getSource() == jb_3F_up){
					
					if(snake.arrayClickInSide.size() != 0){
						snake.arrayClickRunning.clear();
						snake.arrayClickRunning.add(240);
					}
					if(snake.isAllowRunOutSide){
						
						//校驗電梯與觸發事件爲同一層樓
						if(node.y == 300 || node.y == 240){
							snake.isRun = false;
						}else{
							if(snake.isClick && snake.targetFloor > 3){
								snake.derection = Snake.DOWN;
								snake.isClick = false;
								snake.distance = 300;
							}else{
								snake.derection = Snake.UP; 
								snake.distance = 240;
							}
							snake.isRun = true;
							snake.isAllowRunOutSide = false;
							snake.targetFloor = 3;
						}
					}
					//電梯外按鈕點擊數累加
					if(snake.targetFloor >= 3 && snake.currentFloor <= 3
							&& snake.distance < 240){
						snake.arrayClickOutSide.add(240);
					}
				}
				if(e.getSource() == jb_3F_down){
					
					if(snake.arrayClickInSide.size() != 0){
						snake.arrayClickRunning.clear();
						snake.arrayClickRunning.add(300);
					}
					if(snake.isAllowRunOutSide){
						
						//校驗電梯與觸發事件爲同一層樓
						if(node.y == 300 || node.y == 240){
							snake.isRun = false;
						}else{
							if(snake.isClick && snake.targetFloor < 3){
								snake.derection = Snake.UP;
								snake.isClick = false;
								snake.distance = 240;
							}else{
								snake.derection = Snake.DOWN; 
								snake.distance = 300;
							}
							snake.isRun = true;
							snake.isAllowRunOutSide = false;
							snake.targetFloor = 3;
						}
					}
					//電梯外按鈕點擊數累加
					if(snake.targetFloor <= 3 && snake.currentFloor >= 3
							&& snake.distance > 300){
						snake.arrayClickOutSide.add(300);
					}
				}
				if(e.getSource() == jb_4F_up){
					
					if(snake.arrayClickInSide.size() != 0){
						snake.arrayClickRunning.clear();
						snake.arrayClickRunning.add(160);
					}
					if(snake.isAllowRunOutSide){
						
						//校驗電梯與觸發事件爲同一層樓
						if(node.y == 160 || node.y == 220){
							snake.isRun = false;
						}else{
							if(snake.isClick && snake.targetFloor > 4){
								snake.derection = Snake.DOWN;
								snake.isClick = false;
								snake.distance = 220;
							}else{
								snake.derection = Snake.UP; 
								snake.distance = 160;
							}
							snake.isRun = true;
							snake.isAllowRunOutSide = false;
							snake.targetFloor = 4;
						}
					}
					//電梯外按鈕點擊數累加
					if(snake.targetFloor >= 4 && snake.currentFloor <= 4
							&& snake.distance < 160){
						snake.arrayClickOutSide.add(160);
					}
				}
				if(e.getSource() == jb_4F_down){
					
					if(snake.arrayClickInSide.size() != 0){
						snake.arrayClickRunning.clear();
						snake.arrayClickRunning.add(220);
					}
					if(snake.isAllowRunOutSide){
						
						//校驗電梯與觸發事件爲同一層樓
						if(node.y == 160 || node.y == 220){
							snake.isRun = false;
						}else{
							
							if(snake.isClick && snake.targetFloor < 4){
								snake.derection = Snake.UP;
								snake.isClick = false;
								snake.distance = 160;
							}else{
								snake.derection = Snake.DOWN; 
								snake.distance = 220;
							}
							snake.isRun = true;
							snake.isAllowRunOutSide = false;
							snake.targetFloor = 4;
						}
					}
					//電梯外按鈕點擊數累加
					if(snake.targetFloor <= 4 && snake.currentFloor >= 4
							&& snake.distance > 220){
						snake.arrayClickOutSide.add(220);
					}
				}
				if(e.getSource() == jb_5F_up){
					
					if(snake.arrayClickInSide.size() != 0){
						snake.arrayClickRunning.clear();
						snake.arrayClickOutSide.add(80);
					}
					if(snake.isAllowRunOutSide){
						
						//校驗電梯與觸發事件爲同一層樓
						if(node.y == 80 || node.y == 140){
							snake.isRun = false;
						}else{
							if(snake.isClick && snake.targetFloor > 5){
								snake.derection = Snake.DOWN;
								snake.isClick = false;
								snake.distance = 140;
							}else{
								snake.derection = Snake.UP; 
								snake.distance = 80;
							}
							snake.isRun = true;
							snake.isAllowRunOutSide = false;
							snake.targetFloor = 5;
						}
					}
					//電梯外按鈕點擊數累加
					if(snake.targetFloor >= 5 && snake.currentFloor <= 5
							&& snake.distance < 80){
						snake.arrayClickOutSide.add(80);
					}
				}
				if(e.getSource() == jb_5F_down){
					
					if(snake.arrayClickInSide.size() != 0){
						snake.arrayClickRunning.clear();
						snake.arrayClickOutSide.add(140);
					}
					if(snake.isAllowRunOutSide){
						
						//校驗電梯與觸發事件爲同一層樓
						if(node.y == 80 || node.y == 140){
							snake.isRun = false;
						}else{
							if(snake.isClick && snake.targetFloor < 5){
								snake.derection = Snake.UP;
								snake.isClick = false;
								snake.distance = 80;
							}else{
								snake.derection = Snake.DOWN; 
								snake.distance = 140;
							}
							snake.isRun = true;
							snake.isAllowRunOutSide = false;
							snake.targetFloor = 5;
						}
					}
					//電梯外按鈕點擊數累加
					if(snake.targetFloor <= 5 && snake.currentFloor >= 5
							&& snake.distance > 140){
						snake.arrayClickOutSide.add(140);
					}

				}
				if(e.getSource() == jb_6F_down){
					
					if(snake.arrayClickInSide.size() != 0){
						snake.arrayClickRunning.clear();
						snake.isAllowRunOutSide = true;
					}
					if(snake.isAllowRunOutSide){
						
						//校驗電梯與觸發事件爲同一層樓
						if(node.y == 0){
							snake.isRun = false;
						}else{
							snake.isRun = true;
							snake.isAllowRunOutSide = false;
							snake.derection = Snake.UP; 
							snake.distance = 0;
							snake.targetFloor = 6;
						}
					}
				}
				if(e.getSource() == jb_num_1){
					if(snake.isAllowRunInSide){
						if(snake.currentFloor > 1){
							snake.derection = Snake.DOWN;
							snake.arrayClickInSide.add(460);
							snake.isAllowRunInSide = false;
							snake.isAllowRunOutSide = false;
							snake.targetFloor = 1;
						}
					}
				}
				if(e.getSource() == jb_num_2){
					
					if(snake.isAllowRunInSide){
						if(snake.currentFloor != 2){
							if(snake.currentFloor < 2){
								snake.derection = Snake.UP;
								snake.arrayClickInSide.add(320);
							}else{
								snake.derection = Snake.DOWN;
								snake.arrayClickInSide.add(380);
							}
							snake.isAllowRunInSide = false;
							snake.isAllowRunOutSide = false;
							snake.targetFloor = 2;
						}
					}
				}
				if(e.getSource() == jb_num_3){ 
					if(snake.isAllowRunInSide){
						if(snake.currentFloor != 3){
							if(snake.currentFloor < 3){
								snake.derection = Snake.UP;
								snake.arrayClickInSide.add(240);
							}else{
								snake.derection = Snake.DOWN;
								snake.arrayClickInSide.add(300);
							}
							snake.isAllowRunInSide = false;
							snake.isAllowRunOutSide = false;
							snake.targetFloor = 3;
						}
					}
				}
				if(e.getSource() == jb_num_4){
					if(snake.isAllowRunInSide){
						if(snake.currentFloor != 4){
							if(snake.currentFloor < 4){
								snake.derection = Snake.UP;
								snake.arrayClickInSide.add(160);
							}else{
								snake.derection = Snake.DOWN;
								snake.arrayClickInSide.add(220);
							}
							snake.isAllowRunInSide = false;
							snake.isAllowRunOutSide = false;
							snake.targetFloor = 4;
						}
					} 
				}
				if(e.getSource() == jb_num_5){
					if(snake.isAllowRunInSide){
						if(snake.currentFloor != 5){
							if(snake.currentFloor < 5){
								snake.derection = Snake.UP;
								snake.arrayClickInSide.add(80);
							}else{
								snake.derection = Snake.DOWN;
								snake.arrayClickInSide.add(140);
							}
							snake.isAllowRunInSide = false;
							snake.isAllowRunOutSide = false;
							snake.targetFloor = 5;
						}
					} 
				}	
				if(e.getSource() == jb_num_6){
					if(snake.isAllowRunInSide){
						if(snake.currentFloor < 6){
							snake.derection = Snake.UP;
							snake.arrayClickInSide.add(0);
							snake.isAllowRunInSide = false;
							snake.isAllowRunOutSide = false;
							snake.targetFloor = 6;
						}
					} 
				}
				if(e.getSource() == jb_close){
					
					if(snake.arrayClickInSide.size() != 0){
						
						//當前電梯停靠樓層與目標樓層相同,此操作無效
						if(snake.currentFloor == snake.targetFloor){
							snake.isRun = false;
						}else{
							snake.isRun = true;
							snake.isAllowRunInSide = false;
						}
					}else{
						snake.isAllowRunOutSide = true;
					}
					
					if(snake.arrayClickOutSide.size() != 0){
						snake.isRun = true;
					}
				} 
			}
		};
		
		//添加所有頁面上的動作,系統需要監控狀態
		jb_1F_up.addActionListener(l);
		jb_1F_down.addActionListener(l);
		jb_2F_up.addActionListener(l);
		jb_2F_down.addActionListener(l);
		jb_3F_up.addActionListener(l);
		jb_3F_down.addActionListener(l);
		jb_4F_up.addActionListener(l);
		jb_4F_down.addActionListener(l);
		jb_5F_up.addActionListener(l);
		jb_5F_down.addActionListener(l);
		jb_6F_up.addActionListener(l);
		jb_6F_down.addActionListener(l);
		jb_num_1.addActionListener(l);
		jb_num_2.addActionListener(l);
		jb_num_3.addActionListener(l);
		jb_num_4.addActionListener(l);
		jb_num_5.addActionListener(l);
		jb_num_6.addActionListener(l);
		jb_close.addActionListener(l); 
	}
	private void init(){
		//窗口設置
		setTitle("SimulatedElvetor (SE) 1.0");
		setSize(400,530);
		setLayout(null);
		setResizable(false);
		
		//各樓層數字
		jl_1F = new JLabel(" 1");
		jl_1F.setBounds(85,405,20,80);
		jl_1F.setBorder(BorderFactory.createLineBorder(Color.blue));
		add(jl_1F);
		jl_2F = new JLabel(" 2");
		jl_2F.setBounds(85,325,20,80);
		jl_2F.setBorder(BorderFactory.createLineBorder(Color.blue));
		add(jl_2F);
		jl_3F = new JLabel(" 3");
		jl_3F.setBounds(85,245,20,80);
		jl_3F.setBorder(BorderFactory.createLineBorder(Color.blue));
		add(jl_3F);
		jl_4F = new JLabel(" 4");
		jl_4F.setBounds(85,165,20,80);
		jl_4F.setBorder(BorderFactory.createLineBorder(Color.blue));
		add(jl_4F);
		jl_5F = new JLabel(" 5");
		jl_5F.setBounds(85,85,20,80);
		jl_5F.setBorder(BorderFactory.createLineBorder(Color.blue));
		add(jl_5F);
		jl_6F = new JLabel(" 6");
		jl_6F.setBounds(85,5,20,80);
		jl_6F.setBorder(BorderFactory.createLineBorder(Color.blue));
		add(jl_6F);	
		
		//各層樓梯按鈕設置
	    jb_6F_up = new JButton("上");
		jb_6F_up.setBounds(105, 5, 50, 40);
		jb_6F_up.setEnabled(false);
		add(jb_6F_up);
		jb_6F_down = new JButton("下");
		jb_6F_down.setBounds(105, 45, 50, 40);
		add(jb_6F_down);
		jb_5F_up = new JButton("上");
		jb_5F_up.setBounds(105, 85, 50, 40);
		add(jb_5F_up);
		jb_5F_down = new JButton("下");
		jb_5F_down.setBounds(105, 125, 50, 40);
		add(jb_5F_down);
		jb_4F_up = new JButton("上");
		jb_4F_up.setBounds(105, 165, 50, 40);
		add(jb_4F_up);
		jb_4F_down = new JButton("下");
		jb_4F_down.setBounds(105, 205, 50, 40);
		add(jb_4F_down);
		jb_3F_up = new JButton("上");
		jb_3F_up.setBounds(105, 245, 50, 40);
		add(jb_3F_up);
		jb_3F_down = new JButton("下");
		jb_3F_down.setBounds(105, 285, 50, 40);
		add(jb_3F_down);
		jb_2F_up = new JButton("上");
		jb_2F_up.setBounds(105, 325, 50, 40);
		add(jb_2F_up);
		jb_2F_down = new JButton("下");
		jb_2F_down.setBounds(105, 365, 50, 40);
		add(jb_2F_down);
		jb_1F_up = new JButton("上");
		jb_1F_up.setBounds(105, 405, 50, 40);
		add(jb_1F_up);
		jb_1F_down = new JButton("下");
		jb_1F_down.setBounds(105, 445, 50, 40);
		jb_1F_down.setEnabled(false);
		add(jb_1F_down);
		
		//電梯內的樓層按鈕區域
		jb_num_1 = new JButton("1");
		jb_num_1.setBounds(200, 360, 45, 30);
		add(jb_num_1);
		jb_num_2 = new JButton("2");
		jb_num_2.setBounds(245, 360, 45, 30);
		add(jb_num_2);
		jb_num_3 = new JButton("3");
		jb_num_3.setBounds(290, 360, 45, 30);
		add(jb_num_3);
		jb_num_4 = new JButton("4");
		jb_num_4.setBounds(200, 390, 45, 30);
		add(jb_num_4);
		jb_num_5 = new JButton("5");
		jb_num_5.setBounds(245, 390, 45, 30);
		add(jb_num_5);
		jb_num_6 = new JButton("6");
		jb_num_6.setBounds(290, 390, 45, 30);
		add(jb_num_6);
		jb_close = new JButton("關門");
		jb_close.setBounds(200, 330, 135, 30);
		add(jb_close); 
		
		//創建電梯
		JPanel snakePanel = new JPanel();
		snake = new Snake();
		snakePanel = new SnakePanel(snake);
		snakePanel.setBounds(5,5,80,480);
		snakePanel.setBorder(BorderFactory.createLineBorder(Color.darkGray));
		
		//顯示牌
		displayLabel = new JLabel(" 顯   示   牌");
		displayLabel.setBounds(200,200,90,30);
		displayLabel.setBorder(BorderFactory.createLineBorder(Color.blue));
		add(displayLabel); 
		
		//目前所在層數
		floorLabel = new JLabel();
		floorLabel.setBounds(200,231,90,30);
		floorLabel.setBorder(BorderFactory.createLineBorder(Color.blue));
		add(floorLabel); 
		
		//電梯運行狀態
		statusLabel = new JLabel();
		statusLabel.setBounds(200,262,90,30);
		statusLabel.setBorder(BorderFactory.createLineBorder(Color.blue));
		add(statusLabel); 
		
		//電梯運行添加多線程控制
		Runnable r1 = new SnakeRunnable(snake,snakePanel);
		Thread t1 = new Thread(r1);
		t1.start();
		
		//顯示牌添加多線程控制
		Runnable r2 = new StatusRunnable(snake,floorLabel,statusLabel);
		Thread t2 = new Thread(r2);
		t2.start();
		
		add(snakePanel);
	}
}
 
因爲這都是花銷業餘時間編寫,時間緊迫,我自己感覺有很多不完善的地方。

自我感覺,代碼編寫不足之處:命名,結構冗餘。


希望各位多提意見,若以上的代碼有無不明之處,可以留言,我們一起討論。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章