程序名稱:模擬電梯系統
編碼時間: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);
}
}
因爲這都是花銷業餘時間編寫,時間緊迫,我自己感覺有很多不完善的地方。自我感覺,代碼編寫不足之處:命名,結構冗餘。
希望各位多提意見,若以上的代碼有無不明之處,可以留言,我們一起討論。