作业代码:https://coding.net/u/liyi175/p/Dianti/git
伙伴成员:石开洪 http://www.cnblogs.com/shikaihong/(博客)
这次的作业是一个结对作业,我对我的Partner比较熟悉,信任和放心,而他对我也是如此,这对我们顺利完成项目有很大的有利影响。
我们一开始比较默契的是都想到用Java语言进行编写代码,我认为以后工作可能对Java的优势比较大,另外我对Java,Eclipse也比较熟悉,于是
我们就想通过这次作业提升一下自己的Java编程的能力。
好了,下面介绍我们的代码——
可以看到,我们设计了一共6个类,其中电梯有四个类,分别对应一号(firstdt),二号(seconddt),三号(thirddt),四号(forth)电梯,Show类是具体的调度程序,
而xianshi类则是界面设计及其响应组件的类。
下面来看界面——
由于我的原因,要准备校园招聘的面试,所以时间比较紧 ,做的界面不是那么好看,此外电梯内部按钮的开关门也没有加,而在电梯类内部设计了超重,开门,关门函数,但由于时间关系,就没有具体写入进系统,希望以后有时间时能完善一下这个模拟程序吧。
再说这个界面,我们用的组件全部是按钮组件,可能有人会问,为什么外部显示也要用按钮,我想说当时突然的一个想法(利用按钮的透明与实化的变化来实现模拟的电梯运行状态)占据了我的头脑,于是我就这样做了......但是我选的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()函数里新建了一个内部线程类,利用创建线程来实现了电梯的上下按钮显示。以后就没有什么困难了,顺利的完成了编程。
几张运行效果图——
好了,以上就是我们这次的项目,代码还有待优化,功能有待添加,线程弹出提示框有待设计,我们有还待提升。