做業代碼:https://coding.net/u/liyi175/p/Dianti/gitgit
夥伴成員:石開洪 http://www.cnblogs.com/shikaihong/(博客)面試
此次的做業是一個結對做業,我對個人Partner比較熟悉,信任和放心,而他對我也是如此,這對咱們順利完成項目有很大的有利影響。編程
咱們一開始比較默契的是都想到用Java語言進行編寫代碼,我認爲之後工做可能對Java的優點比較大,另外我對Java,Eclipse也比較熟悉,因而ide
咱們就想經過此次做業提高一下本身的Java編程的能力。函數
好了,下面介紹咱們的代碼——學習
能夠看到,咱們設計了一共6個類,其中電梯有四個類,分別對應一號(firstdt),二號(seconddt),三號(thirddt),四號(forth)電梯,Show類是具體的調度程序,測試
而xianshi類則是界面設計及其響應組件的類。優化
下面來看界面——spa
因爲個人緣由,要準備校園招聘的面試,因此時間比較緊 ,作的界面不是那麼好看,此外電梯內部按鈕的開關門也沒有加,而在電梯類內部設計了超重,開門,關門函數,但因爲時間關係,就沒有具體寫入進系統,但願之後有時間時能完善一下這個模擬程序吧。.net
再說這個界面,咱們用的組件所有是按鈕組件,可能有人會問,爲何外部顯示也要用按鈕,我想說當時忽然的一個想法(利用按鈕的透明與實化的變化來實現模擬的電梯運行狀態)佔據了個人頭腦,因而我就這樣作了......可是我選的Java語言 和按鈕組件對之後埋下了一個問題,後文再說......
接下來介紹具體的調度系統,我我的認爲,一個按鈕控制四部電梯這種狀況及其不合理......我認爲實際狀況最好是設置成一個按鈕控制一部或兩部。所以個人調度寫的也比較簡單。
上代碼——
1 if(num%2==0) //當前樓層爲雙層,第二部電梯沒法停靠 2 { 3 int a1=f.getzt(); //肯定三部電梯目前的狀態 4 int a3=t.getzt(); 5 int a4=f2.getzt(); 6 int b1=f.getfloor(); //1 7 int b2=t.getfloor(); //3 8 int b3=f2.getfloor(); //4 9 int b7=sd.getfloor();//2 10 11 12 if(a1==0) 13 { 14 15 diaodu1(ck,num,b8); //調度第一部電梯 16 } 17 18 if(a1!=0&&a3==0&&a4!=0) 19 { 20 diaodu3(ck,num,b4); 21 } 22 if(a1!=0&&a3==0&&a4==0) 23 { 24 diaodu3(ck,num,b4); //調度第三部電梯 25 26 } 27 if(a1!=0&&a3!=0&&a4==0) 28 { 29 diaodu4(ck,num,b5); //調度第四部電梯 30 31 } 32 if(a1!=0&&a3!=0&&a4!=0) 33 { 34 if(a1==2&&b1>num) //三個降低的電梯判斷樓層是否在當前樓層之上 35 { 36 diaodu1(ck,num,b8); 37 } 38 else if(a3==2&&b2>num) 39 { 40 diaodu3(ck,num,b4); 41 } 42 else if(a4==2&&b3>num) 43 { 44 diaodu4(ck,num,b5); 45 } 46 else { 47 a1=f.getzt(); //肯定三部電梯目前的狀態 48 a3=t.getzt(); 49 a4=f2.getzt(); 50 while(a1!=0&&a4!=0&&a3!=0) 51 { 52 try{ 53 Thread.sleep(3000); 54 } catch (InterruptedException e) { 55 // TODO Auto-generated catch block 56 e.printStackTrace(); 57 } 58 a1=f.getzt(); //肯定三部電梯目前的狀態 59 a3=t.getzt(); 60 a4=f2.getzt(); 61 } 62 if(a1==0) 63 { 64 diaodu1(ck,num,b8); 65 }else if(a1!=0&&a3==0&&a4!=0) 66 { 67 diaodu3(ck,num,b4); 68 }else if(a1!=0&&a3!=0&&a4==0) 69 { 70 diaodu4(ck,num,b5); 71 }else if(a1==0&&a3==0&&a4==0) 72 { 73 diaodu1(ck,num,b8); 74 } 75 76 } 77 78 79 } 80 }
這是一個樓層爲雙層的而且按下的是向下狀態的調度,首先要接受四部電梯的正在運行的狀態,當前樓層,以後再進行調度。
這是調度函數。(請忽略f.getgate(),並無具體設計開門,關門,超重等問題......)
1 public void diaodu1(JButton ck,int num,JButton b8[]) 2 { 3 4 f.setfloor(ck,num,b8); 5 f.getgate(false); 6 7 } 8 9 public void diaodu2(JButton ck,int num,JButton b[]) 10 { 11 12 sd.setfloor(ck,num,b); 13 14 sd.getgate(false); 15 16 17 } 18 public void diaodu3(JButton ck,int num,JButton b4[]) 19 { 20 21 t.setfloor(ck,num,b4); 22 23 t.getgate(false); //開門 24 25 } 26 public void diaodu4(JButton ck,int num,JButton b5[]) 27 { 28 29 f2.setfloor(ck,num,b5); 30 31 f2.getgate(false); 32 33 34 }
單層的與其相似。
而後是類內部的代碼——
1 public void goup(JButton b8[]){ 2 3 try{ 4 Thread.sleep(2000); 5 } catch (InterruptedException e1) { 6 // TODO Auto-generated catch block 7 e1.printStackTrace();} 8 floor++; 9 b8[floor].setContentAreaFilled(true); 10 b8[floor-1].setContentAreaFilled(false); 11 12 } 13 14 15 public void godown(JButton b8[]){ 16 try{ 17 Thread.sleep(2000); 18 } catch (InterruptedException e) { 19 // TODO Auto-generated catch block 20 e.printStackTrace(); 21 } 22 23 floor--; 24 b8[floor].setContentAreaFilled(true); 25 b8[floor+1].setContentAreaFilled(false); 26 27 } 28 public void setfloor(JButton ck,int goal,JButton b8[]) { 29 30 Thread thread=new Thread(){ 31 32 @Override 33 public void run(){ 34 35 while(floor!=goal) 36 { 37 if(floor<goal) 38 { 39 40 goup(b8); 41 zt=1; 42 43 44 } 45 else 46 { 47 godown(b8); 48 zt=2; 49 } 50 } 51 zt=0; 52 ck.setContentAreaFilled(false); 53 JOptionPane.showMessageDialog(null, "電梯已經到達該層", "警告", JOptionPane.WARNING_MESSAGE); 54 JOptionPane.showMessageDialog(null, "當前是一號電梯 ,請選擇目的樓層", "電梯提示",JOptionPane.PLAIN_MESSAGE); 55 56 57 } 58 }; 59 thread.start(); 60 61 62 }
這是主要的代碼,執行上下樓的功能,以及按鈕的透明,實體的變化。上面我說的問題就出如今這裏,我最初設計的時候是隻設計了一個線程睡眠放在了goup(),godown()函數裏,setfloor()函數裏面知識一個簡單的循環,並無線程,目的是想讓界面在響應時能一個一個的讓按鈕變化。可是在測試時呈現的是先執行完了全部循環,最後按鈕才一塊兒變化。這個問題令我困擾了很長時間,我去請教了不少人,表示都不明白,我也是在無奈去羣裏問了一句,雖然獲得了幾個同窗熱心的幫助,提供了他們的幾種見解,可是並不能解決問題,因而我就上網,看書學習,瞭解更多的線程方面的問題。最後我纔在setfloor()函數裏新建了一個內部線程類,利用建立線程來實現了電梯的上下按鈕顯示。之後就沒有什麼困難了,順利的完成了編程。
幾張運行效果圖——
好了,以上就是咱們此次的項目,代碼還有待優化,功能有待添加,線程彈出提示框有待設計,咱們有還待提高。