if(i==0){
j=0;
redStatus=true;//红灯亮
greenStatus=false;
yellowStatus=false;
}elseif(i==redTimes){
j=0;
redStatus=false;
greenStatus=false;
yellowStatus=true;//黄灯亮
}elseif(i==redTimes+yellowTimes){
j=0;
redStatus=false;
greenStatus=true;//绿灯亮
yellowStatus=false;
}elseif(i==redTimes+greenTimes+yellowTimes){
j=0;
redStatus=false;
greenStatus=false;
yellowStatus=true;//黄灯亮
}
repaint;
j++;
if(i==redTimes+greenTimes+yellowTimes+yellowTimes1)
i=1;
try{
Thread、sleep(1000);
}catch(InterruptedExceptione){
e、printStackTrace;
}
}
三、调试及测试
1、调试过程中遇到得主要问题及解决方法
在调试过程中主要就是控制小车行驶比较难以实现,起初当所有面板中静态得图片处理完成后,无法将下载得小车图片加入面板后进行运动操作,主要问题就是开始把小车运动想得太简单了以为完成完成下列操作即可:
(1)创建Image类得对象数组car,用来缓存要演示得小车图片,
(2)利用getDocumentBase函数方法获取图片信息,(3)再使用Thread、sleep方法,但就是当运行程序时会报错,显示
找不到getDocumentBase,原因就是所做得程序就是Application程序,不能使用函数getDocumentBase,而使用Im=Toolkit、getDefaultToolkit、getImage((type+1)+"、jpg"),才可完成获取图片信息得功能。
2、对设计与编码得回顾讨论与分析
该程序得设计主要用到以下类库:
importjava、awt、BorderLayout;
importjava、awt、Color;
importjava、awt、Dialog;
importjava、awt、Graphics;
importjava、awt、Image;
importjava、awt、Toolkit;
importjava、awt、event、ActionEvent;
importjava、awt、event、ActionListener;
importjava、awt、event、WindowAdapter;
importjava、awt、event、WindowEvent;
importjava、awt、image、BufferStrategy;//处理与操作来自于网上得图片定义图像对象,双缓存
importjava、util、ArrayList;//实现可变大小得数组
importjava、util、Collections;//java、util、*就是包括集合、事件处理模式、日期时间工具等各类常用工具包
importjava、util、Date;
importjava、util、List;//list就是有序得collection,使用此接口能够精确得控制每个元素插入得位置
importjavax、swing、JButton;
importjavax、swing、JFrame;
importjavax、swing、JLabel;
importjavax、swing、JPanel;
importjavax、swing、JTextField;
程序中还多次用到线程控制,比如控制小车行驶线程CarRunThread,随机产生小车线程CarThread,控制红绿灯状态线程PaintThread等。
下面就是程序设计中主要得类与线程:
Luche类里设定了默认得红灯亮灯时间为8ms,绿灯亮灯时间为10ms,黄灯亮灯时间为3ms。
创建数组car,存放小车。
Paint函数用来每10ms根据既定坐标画出公路,绿地界面随机产生得小车当前得坐标值画出小车及既定坐标圆形得红绿灯与亮灯倒计时时间,组成整个交通图。
Lauchh函数用来启动PaintThread(红绿灯倒计时时间计算),CarThread(随机产生小车),CarRunThead(控制小车行驶)三个线程。
CarThread类随机产生小车,(long)(Math、random*1200)计算出随机数,在该时间段里(0到1、2s)随机产生小车。
CarRunThread类控制小车行驶,根据Type值即各个方向逐一判断该方向小车得行驶状况,以西东方向为例:
Luche、this、isGreenStatus||Luche、this、isYellowStatus)&&Math、abs(car、getX320)<5)||hasObstructor(car,cars)
当南北方向绿灯亮即当前方向红灯亮或者黄灯亮并且小车距离路口不到五个像素点(小车为路口第一辆)或者小车前有障碍物(小车前有车,没有可行进距离),此时小车停。
继续判断下一辆小车。
否则car、setX(car、getX+5);小车坐标改变,表明小车可继续前行。
小车坐标值超出界面别界则移除该小车。
程序每10ms对List里所有小车状态进行循环判断。
其中函数hasObstructor用来判断当前小车前方就是否有障碍物,对各方向上得小车循环通过计算相邻小车之间距离即相邻小车坐标差值判断就是否有可行进距离。
当相邻小车距离大于0且不足46个像素点时,小车前方有障碍物。
PaintThread线程里面控制了三个灯得亮灯时间,设置全局变量j=0,记录各灯亮灯时间,继而用用户设置得亮灯时间减去已亮时间,得到亮灯倒计时。
红灯时间+绿灯时间+两倍黄灯时间为一个周期,线程每1000ms循环统计一次。
Car类里,计算了小车方向随机值:
type=(int)(((Math、random)*(newDate、getTime)*10)%4);
随机产生四个值0,1,2,3,获取Type+1、jpg小车图片:
Type=0,小车起点坐标(0,240),为西东方向,小车图片为1、jpg;
Type=1,小车起点坐标(1500,240),为东西方向,小车图片为2、jpg;
Type=2,小车起点坐标(235,0),为北南方向,小车图片为3、jpg;
Type=3,小车起点坐标(280,1500),为南北方向,小车图片为4、jpg。
CarFactory类里获得Car数组里随机产生得小车,并把产生小车值
返回Car类。
程序中不同得类实现不同得功能,每个功能又通过各自线程得控制,异步执行从而达到同步效果,最终完成交通灯模拟程序要求。
3、程序运行得时空效率分析
程序中定义图像应用到了双缓存,方便程序执行。
同时程序中使用synchronizedList得到得就是同步容器,使线程同步执行,节约运行时间,程序中设定当车辆运行超出范围时则移除该车,因此已经移除得车不会再继续占用空间。
但就是程序中不足得就是,因为信号灯得变化间隔就是1s所以在每次隔10ms执行publicvoidpaint(Graphicsg1)时,信号灯得交替时间还未到而被重画,这样会不同程度得浪费资源,不过这个程序就是小程序可能不会有大得影响,若就是扩大程序,则需进一步完善。
4、测试数据集
(1)默认设置信号灯持续时间:
图3运行结果1
(2)重新设置信号灯持续时间:
图4运行结果2
四、经验与体会。
通过学习了近一个学期得JAVA课后,设计完成了交通灯程序,通过这个程序,我对线程有了很深得认识,对于它就是如何实现以及两个或更多得线程共同使用时如何条用得,有了更进一步得了解。
学习该语言期间,明显感到它与其她得高级语言不同,比起C或C++更方便使用,或许我接触得时间还不长,使用得机会还不多,尤其就是大段程序设计。
另一个则就是画图,由这个程序我已基本上掌握了画图得程序写法。
不过对于此程序得有些地方我觉得有必要作些说明,这样能帮助更好得理解我得方法。
importjava、awt、*;importjava、awt、event、*;
这两行就是对于程序中要用到得抽象窗口工具包做个定义。
因为JAVA提供得用于语言开发得类库,称为应用程序编程接口,分别放在不同得包中。
前一句就是AWT核心包,后一句就是提供事件类与监听器得包。
WindowListener,ponentListener,ItemListener
这一行就是对程序中用可能要用到得EVENT事件类总得声明一下,以后得程序里必须包含着各个事件类所相对应得接口。
这些接口中包含所要执行得程序代码或就是调用得函数名,若就是无此接口任务时,可不写任何代码。
同时,通过进一步巩固、加深了我们所学专业课程得基本理论知识,理论联系实际,进一步培养学生综合分析问题,解决问题得能力。
全面考核我们所掌握得基本理论知识及其实际业务能力,从而达到提高学生素质得最终目得。
利用所学知识,开发小型应用系统,掌握运用JAVA语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理得综合能力。
对于给定得设计题目,如何进行分析,理清思路,并给出相应得数学模型。
熟练掌握JAVA语言得GUI设计、多线程技术,灵活运用各种类库。
五、源程序
importjava、awt、BorderLayout;
importjava、awt、Color;
importjava、awt、Dialog;
importjava、awt、Graphics;
importjava、awt、Image;
importjava、awt、Toolkit;
importjava、awt、event、ActionEvent;
importjava、awt、event、ActionListener;
importjava、awt、event、WindowAdapter;
importjava、awt、event、WindowEvent;
importjava、awt、image、BufferStrategy;
importjava、util、ArrayList;
importjava、util、Collections;
importjava、util、Date;
importjava、util、List;
importjavax、swing、JButton;
importjavax、swing、JFrame;
importjavax、swing、JLabel;
importjavax、swing、JPanel;
importjavax、swing、JTextField;
publicclassMainFrameextendsJFrame{
privateJLabelredlight_label=newJLabel("红灯时间:
秒");
privateJLabelgreenlight_label=newJLabel("绿灯时间:
秒");
privateJLabelyellowlight_label=newJLabel("黄灯时间:
秒");
privateJTextFieldredlight_field=newJTextField;
privateJTextFieldgreenlight_field=newJTextField;
privateJTextFieldyellowlight_field=newJTextField;
privateJButtonbtn_set=newJButton("设置");
privateLucheluche=newLuche;
publicMainFrame{
setTitle("交通灯模拟程序");
setDefaultCloseOperation(JFrame、EXIT_ON_CLOSE);
setSize(600,600);
setLayout(null);
redlight_label、setBounds(10,10,200,25);
redlight_field、setBounds(70,10,40,25);
greenlight_label、setBounds(150,10,200,25);
greenlight_field、setBounds(210,10,40,25);
yellowlight_label、setBounds(280,10,200,25);
yellowlight_field、setBounds(340,10,40,25);
add(yellowlight_field);
add(greenlight_field);
add(redlight_field);
add(greenlight_label);
add(yellowlight_label);
add(redlight_label);
btn_set、setBounds(400,10,80,25);//设置窗口位置与大小,出示位置为(400,10)参数单位为像素
add(btn_set);
luche、setBounds(0,50,2000,2000);
add(luche);
luche、lauch;
add(btn_set);
btn_set、addActionListener(newActionListener{
//Override
publicvoidactionPerformed(ActionEventarg0){
try{
intredTimes=Integer、parseInt(redlight_field、getText);
intgreenTimes=Integer、parseInt(greenlight_field、getText);
intyellowTimes=Integer、parseInt(yellowlight_field、getText);
luche、setRedTimes(redTimes);
luche、setGreenTimes(greenTimes);
luche、setYellowTimes(yellowTimes);
}catch(NumberFormatExceptione){
e、printStackTrace;//用来在屏幕上输出当前异常对象使用得堆栈得轨迹
}
}
});
setVisible(true);
}
publicstaticvoidmain(String[]args){
newMainFrame;
}
}
classLucheextendsJPanel{
privatebooleanredStatus=false,greenStatus=false,yellowStatus=false;
intj=0;
privateintredTimes=8;
privateintgreenTimes=10;
privateintyellowTimes=3;
privateListcars=Collections、synchronizedList(newArrayList);Luche{
setBackground(Color、GREEN);
}
publicvoidup