南邮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();
        }
    }
}


  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值