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

}

}

}

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

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

  1. groovy 使用java类_深入学习java中的Groovy 和 Scala 类

    前言 Java 传承的是平台,而不是语言.有超过 200 种语言可以在 JVM 上运行,它们之中不可避免地会有一种语言最终将取代 Java 语言,成为编写 JVM 程序的最佳方式.本系列将探讨三种下一 ...

  2. java 枚举_深入理解Java枚举

    所有知识体系文章,[GitHub](https://github.com/Ziphtracks/JavaLearningmanual)已收录,欢迎Star!再次感谢,愿你早日进入大厂! https:/ ...

  3. java翻译程序_有没有java代码翻译软件?

    展开全部 没有翻译软件,但是能32313133353236313431303231363533e78988e69d8331333365646333编写翻译程序. java 代码翻译实例: 1.输入一个 ...

  4. opencv java 摄像头_使用OpenCV Java创建Windows摄像头扫码程序

    OpenCV提供了一些基本的Webcam控制接口.用OpenCV C/C++或者Python,可以在任意平台快速创建一个摄像头预览应用.然而使用Java,情况就复杂的多,因为OpenCV Java并没 ...

  5. java横线_知识点:java一些方法会有横线?以Date 过期方法为例

    原因:他们的开发者在升级方法后,添加了@Deprecated注释, 目的是为了提醒我们,这个方法现在已经有新的方法了,不建议继续使用! 比如: JAVA中Date的tolocalstring为什么不建 ...

  6. java学习_都说Java难学,不知道具体的学习内容?全套Java学习路线送上

    首先,我个人比较推崇的学习方法是:先学java前段,也就是HTML,css,js,因为学习java以后肯定是往java ee方向发展的,学习完前端,在学习后端很多东西比计较容易理解! 其中J2SE是关 ...

  7. 本地生活JAVA版本_赶集生活java版

    赶集网java版客户端 特色介绍: * 丰富的特色功能:一键拨号.GPS定位.本地收藏.拍照发帖,比电脑还方便. * 全面的服务功能:房屋租售.二手买卖.火车票转让.家政.开锁等全方位服务. * 极致 ...

  8. java 虚拟机_浅谈Java虚拟机内存区

    1. Java 虚拟机内存区概述 我们在编写程序时,经常会遇到OOM(out of Memory)以及内存泄漏等问题.为了避免出现这些问题,我们首先必须对JVM的内存划分有个具体的认识.JVM将内存主 ...

  9. java序列化_技术干货 | JAVA反序列化漏洞

    目录 反序列化漏洞 序列化和反序列化 JAVA WEB中的序列化和反序列化 对象序列化和反序列范例 JAVA中执行系统命令 重写readObject()方法 Apache Commons Collec ...

最新文章

  1. redis-5.0.4集群部署
  2. TFS2008 基本安装
  3. 052_Function对象
  4. 支付和清算就是信息流和资金流
  5. jsp中使用cookie时报错……
  6. 数据科学 python_适用于数据科学的Python vs(和)R
  7. java基础—Objcet中的equals方法重写
  8. 华为还是输了!双11战报出炉,离苹果仍有距离
  9. Jar运行的几个方法
  10. 编程之美读书笔记2.15 - 子数组之和的最大值(二维)
  11. Linux命令:more
  12. 并发学习之CyclicBarrier循环栅栏
  13. Kubernetes SharedInformerFactory共享Informer机制源码深入剖析-Kubernetes商业环境实战
  14. 怎么重置计算机网络设置密码,怎么重新设置wifi密码_如何重新设置无线密码?-192路由网...
  15. unison + inotify 实现文件实时双向同步部署步骤
  16. 2017 ECNA Regional Contest-G:Question of Ingestion(dp)
  17. 分享湖南软大自动健康打卡思路
  18. 十一、Cadence ic 617以及assura使用总结
  19. 7-1 sdut-oop-7 答答租车系统(类的继承与多态 面向对象综合练习) (30 分)
  20. 详解百度地图API之地图标注

热门文章

  1. html文档是哪个版本,HTML 简介, 版本和文档类型声明
  2. Project build error: Non-resolvable parent POM for com.example:demo:0.0.1-SNAPSHOT: Could not transf
  3. 短信通知-阿里大鱼 申请AK 发送Until
  4. 关于后缀表达式的转换
  5. java表格组件_表格组件 java
  6. 13商软 团队博客 列表
  7. SEO中的十大关键词竞争度分析方法
  8. Docker之工作中常用的命令(二)
  9. 「开发者说」多系统集成开发-企业自有系统快速上钉钉
  10. DTM使用途中的bug记录