当前位置:文档之家› JAVA线程程序设计(小时钟)实验报告(附完整代码)

JAVA线程程序设计(小时钟)实验报告(附完整代码)

线程程序设计
一、课题内容和要求
内容:设计和编写一个编写一个指针式时钟程序,应用线程实现时钟的走动。

要求:本实验旨在通过实验,培养学生将JAVA 线程的相关知识点(包括线程调度,线程同步等)有机结合并加以综合应用,在实验中设计多线程程序的能力。

二、设计思路分析
class Clock:一个指针式时钟的主类
class Layout: 添加窗口和时钟组件
class ClockPaint:定义时钟组件
三、概要设计
public class Clock extends JFrame {
public static void main(String[] s) ;
}
class Layout extends JFrame {
public Layout();
}
class ClockPaint extends JPanel implements Runnable {
int x, y, r;
int h, m, s;
double rad = Math.PI / 180;
public ClockPaint(int x, int y, int r);
public void paint(Graphics g);
public void run();
}
时钟的绘制:
运行时钟:
四、详细设计
import java.awt.*;
import javax.swing.*;
import java.util.*;
public class Clock extends JFrame {
public static void main(String[] s) {
new Layout();
}
}
class Layout extends JFrame {// 添加窗口和时钟组件public Layout() {
ClockPaint cp = new ClockPaint(20, 20, 70);
add(cp);
setBounds(260, 120, 200, 200);
setResizable(false);
this.setTitle("指针式时钟");
this.setVisible(true);
}
}
class ClockPaint extends JPanel implements Runnable {// 定义时钟组件
int x, y, r;// 时钟的位置坐标和半径
int h, m, s;// 小时,分钟,秒
double rad = Math.PI / 180;// 定义弧度
public ClockPaint(int x, int y, int r) {// 构造函数
this.x = x;
this.y = y;
this.r = r;
Calendar now = 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;// 获得初始小时转换成度数加分钟实现连贯
Thread t = new Thread(this);// 新建线程
t.start();// 启动线程
}
public void paint(Graphics g) {// 绘制时钟
g.setColor(Color.BLACK);// 画背景
g.fillRect(0, 0, r * 3, r * 3);
g.setColor(Color.WHITE);// 画圆
g.drawOval(x, y, r * 2, r * 2);
int d = 0;// 每6度画一个小点
int x1, y1, x2, y2;
for (int i = 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 (int i = 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);// 显示时间
Calendar now1 = Calendar.getInstance();
g.drawString(
now1.get(Calendar.HOUR_OF_DAY) + ":"
+ now1.get(Calendar.MINUTE) + ":"
+ now1.get(Calendar.SECOND), 0, 10); }
public void run() {// 运行时钟
while (true) {
try {
Thread.sleep(1000);// 中断一秒后重新运行} catch (Exception ex) {
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、在逐步地优化和调试中实现了一个较切合实际的时钟界面。

相关主题