南邮java实验_南邮JAVA程序设计实验4 线程程序设计(指针式时钟)

南邮JAVA程序设计实验4  线程程序设计(指针式时钟)

实验目的:

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

实验内容:

设计和编写一个编写一个指针式时钟程序,应用线程实现时钟的走动。

实验设计:

主要是控制时针分针秒针的转动度数,这个直接通过坐标的三角函数值求得,线程方面,隔一秒休眠一下,然后通过时分秒的换算关系来改变三个对应指示针在时钟上的位置

实验代码:

import java.awt.*;

import javax.swing.*;

import java.util.*;

public class JavaClock extends JFrame {

public JavaClock() {

ClockPaint cp = new ClockPaint(20, 20, 70);

this.add(cp);

this.setSize(200, 200);

this.setLocation(260, 120);

this.setTitle("指针时钟");

this.setVisible(true);

this.setResizable(false);

}

public static void main(String[] s) {

new JavaClock();

}

}

class ClockPaint extends JPanel implements Runnable {

int x, y, r;

int hour, minute, second; //时,分,秒

final double rad = Math.PI / 180;

public ClockPaint(int x, int y, int r) {

this.x = x;

this.y = y;

this.r = r;

Calendar now = new GregorianCalendar();

//获得时间转换成度数

second = now.get(Calendar.SECOND) * 6;

minute = now.get(Calendar.MINUTE) * 6;

hour = (now.get(Calendar.HOUR_OF_DAY) - 12) * 30 + now.get(Calendar.MINUTE) / 12 * 6;

Thread t = new Thread(this);

t.start();

}

public void paint(Graphics g) {

super.paint(g);

g.setColor(Color.WHITE);

g.fillRect(0, 0, r * 3, r * 3);

g.setColor(Color.BLACK);

g.drawOval(x, y, r * 2, r * 2);

//秒针

g.setColor(Color.GREEN);

int x1 = (int)((r - 10) * Math.sin(rad * second));

int y1 = (int)((r - 10) * Math.cos(rad * second));

g.drawLine(x + r, y + r, x + r + x1, y + r - y1);

//分针

g.setColor(Color.BLUE);

x1 = (int)((r - r / 2.5) * Math.sin(rad * minute));

y1 = (int)((r - r / 2.5) * Math.cos(rad * minute));

g.drawLine(x + r, y + r, x + r + x1, y + r - y1);

//时针

g.setColor(Color.RED);

x1 = (int)((r - r / 1.5) * Math.sin(rad * hour));

y1 = (int)((r - r / 1.5) * Math.cos(rad * hour));

g.drawLine(x + r, y + r, x + r + x1, y + r - y1);

//数字

g.setColor(Color.BLACK);

int d = 28;

for (int i = 1; i <= 12; i++) {

x1 = (int)((r - 10) * Math.sin(rad * d));

y1 = (int)((r - 10) * Math.cos(rad * d));

g.drawString(i + "", x + r + x1 - 4, x + r - y1 + 5);

d += 30;

}

//刻度线

d = 0;

for (int i = 0; i < 60; i++) {

int len = 0; //控制每个分割点的长度,数字点上的分割线长一点

if(d % 30 == 0) {

len = 5;

}

else {

len = 2;

}

for (int j = 1; j <= len; j++)

{

x1 = (int)((r - j) * Math.sin(rad * d));

y1 = (int)((r - j) * Math.cos(rad * d));

g.drawString(".", x + r + x1 - 1, x + r - y1 + 1);

}

d += 6;

}

}

public void run() {

while (true) {

try {

Thread.sleep(1000); //休眠一秒

}

catch (Exception ex) {

}

second += 6; //每一秒,秒针动6度

if (second == 60 || second == 120 || second == 180 || second == 240 || second == 300) {

minute += 1; //每10秒,分针动1度

}

//大于一分钟,分针和时针开始出现改变

if (second == 360) {

second = 0;

minute += 1;

if (minute == 72 || minute == 144 || minute == 216 || minute == 288) {

hour += 6;

}

if (minute >= 360) {

minute = 0;

hour += 6;

}

if (hour >= 360) {

hour = 0;

}

}

this.repaint();

}

}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值