JAVA线程程序设计小时钟实验报告附代码.doc
《JAVA线程程序设计小时钟实验报告附代码.doc》由会员分享,可在线阅读,更多相关《JAVA线程程序设计小时钟实验报告附代码.doc(5页珍藏版)》请在冰点文库上搜索。
线程程序设计
一、课题内容和要求
内容:
设计和编写一个编写一个指针式时钟程序,应用线程实现时钟的走动。
要求:
本实验旨在通过实验,培养学生将JAVA线程的相关知识点(包括线程调度,线程同步等)有机结合并加以综合应用,在实验中设计多线程程序的能力。
二、设计思路分析
classClock:
一个指针式时钟的主类
classLayout:
添加窗口和时钟组件
classClockPaint:
定义时钟组件
三、概要设计
publicclassClockextendsJFrame{
publicstaticvoidmain(String[]s);
}
classLayoutextendsJFrame{
publicLayout();
}
classClockPaintextendsJPanelimplementsRunnable{
intx,y,r;
inth,m,s;
doublerad=Math.PI/180;
publicClockPaint(intx,inty,intr);
publicvoidpaint(Graphicsg);
publicvoidrun();
}
时钟的绘制:
运行时钟:
四、详细设计
importjava.awt.*;
importjavax.swing.*;
importjava.util.*;
publicclassClockextendsJFrame{
publicstaticvoidmain(String[]s){
newLayout();
}
}
classLayoutextendsJFrame{//添加窗口和时钟组件
publicLayout(){
ClockPaintcp=newClockPaint(20,20,70);
add(cp);
setBounds(260,120,200,200);
setResizable(false);
this.setTitle("指针式时钟");
this.setVisible(true);
}
}
classClockPaintextendsJPanelimplementsRunnable{//定义时钟组件
intx,y,r;//时钟的位置坐标和半径
inth,m,s;//小时,分钟,秒
doublerad=Math.PI/180;//定义弧度
publicClockPaint(intx,inty,intr){//构造函数
this.x=x;
this.y=y;
this.r=r;
Calendarnow=Calendar.getInstance();//初始化日历对象
s=now.get(Calendar.SECOND)*6;//获得初始秒转换成度数
m=now.get(Calendar.MINUTE)*6;//获得初始分钟转换成度数
h=(now.get(Calendar.HOUR_OF_DAY)-12)*30
+now.get(Calendar.MINUTE)*6/12;//获得初始小时转换成度数加分钟实现连贯
Threadt=newThread(this);//新建线程
t.start();//启动线程
}
publicvoidpaint(Graphicsg){//绘制时钟
g.setColor(Color.BLACK);//画背景
g.fillRect(0,0,r*3,r*3);
g.setColor(Color.WHITE);//画圆
g.drawOval(x,y,r*2,r*2);
intd=0;//每6度画一个小点
intx1,y1,x2,y2;
for(inti=0;i<60;i++){
x1=(int)((r-2)*Math.sin(rad*d));
y1=(int)((r-2)*Math.cos(rad*d));
g.drawString(".",x+r+x1-1,x+r-y1+1);
d+=6;
}
d=30;//从30度开始每30度画一个数字和一线
for(inti=1;i<=12;i++){
x1=(int)((r-14)*Math.sin(rad*d));
y1=(int)((r-14)*Math.cos(rad*d));
g.drawString(i+"",x+r+x1-4,x+r-y1+5);
x1=(int)((r-6)*Math.sin(rad*d));
y1=(int)((r-6)*Math.cos(rad*d));
x2=(int)((r-2)*Math.sin(rad*d));
y2=(int)((r-2)*Math.cos(rad*d));
g.drawLine(x+r+x2,y+r-y2,x+r+x1,y+r-y1);
d+=30;
}
g.setColor(Color.RED);//按时间画秒针
x1=(int)((0.8*r)*Math.sin(rad*s));
y1=(int)((0.8*r)*Math.cos(rad*s));
g.drawLine(x+r,y+r,x+r+x1,y+r-y1);
g.setColor(Color.BLUE);//按时间画分针
x1=(int)((0.6*r)*Math.sin(rad*m));
y1=(int)((0.6*r)*Math.cos(rad*m));
g.drawLine(x+r,y+r,x+r+x1,y+r-y1);
g.setColor(Color.YELLOW);//按时间画时针
x1=(int)((0.4*r)*Math.sin(rad*h));
y1=(int)((0.4*r)*Math.cos(rad*h));
g.drawLine(x+r,y+r,x+r+x1,y+r-y1);
g.setColor(Color.GREEN);//显示时间
Calendarnow1=Calendar.getInstance();
g.drawString(
now1.get(Calendar.HOUR_OF_DAY)+":
"
+now1.get(Calendar.MINUTE)+":
"
+now1.get(Calendar.SECOND),0,10);
}
publicvoidrun(){//运行时钟
while(true){
try{
Thread.sleep(1000);//中断一秒后重新运行
}catch(Exceptionex){
System.out.println(ex);
}
s+=6;//秒针走6度
if(s>=360){//秒针走完一分钟后重置
s=0;
m+=6;
if(m==72||m==144||m==216||m==288){//分针走完5分钟后重置
h+=6;
}
if(m>=360){//分针走完一小时后重置
m=0;
h+=6;
}
if(h>=360){//时针走完12小时后重置
h=0;
}
}
this.repaint();//重新绘制时钟
}
}
}
五、测试数据及其结果分析
1时钟界面:
2结果:
输出正常。
六、调试过程中的问题
一开始没有考虑分钟走五分钟时针应走一小格,在参考机械时钟的设计后,实现了时钟的连贯走动。
七、程序设计总结
1、通过该实验掌握了应用线程实现时钟的走动的方法。
2、学会了编写时钟的算法、多线程的设计与使用。
3、在逐步地优化和调试中实现了一个较切合实际的时钟界面。