`
JavaSam
  • 浏览: 952150 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA 实现钟表例子学习用

    博客分类:
  • JAVA
 
阅读更多

 

package com.file;

import java.awt.*;
import java.applet.*;
import java.util.*;
//操作运用多线程实现一个钟表的类
public class TextClock extends Applet implements Runnable {
	Thread HOUR_THREAD = null;// 表示时针的线程
	Thread MINUTE_THREAD = null;// 表示分针的线程
	Thread SECOND_THREAD = null;// 表示秒针的线程
	int hour_a, hour_b, minute_a, minute_b, second_a, second_b;// 表示时针,分针,秒针端点的整型变量
	int current_hour = 0;// 获取当前的时整数变量
	int current_minute = 0;// 获取当前的分整数变量
	int current_second = 0;// 获取当前的秒整数变量
	Graphics second_graphics = null;// 绘制秒针的Graphics对象
	Graphics minute_graphics = null;// 绘制分针的Graphics对象
	Graphics hour_graphics = null;// 绘制时针的Graphics对象
	double point_x[] = new double[61];// 存放表盘刻度的X轴数组
	double point_y[] = new double[61];// 存放表盘刻度的Y轴数组
	double scan_x[] = new double[61];// 供绘制表盘使用
	double scan_y[] = new double[61];
	int isStart = 0;// 判断是否重新开始

	public void init() {// 数据初始化
		hour_graphics = this.getGraphics();// 实例化时针Graphics对象
		hour_graphics.setColor(Color.black);// 设置时针的颜色
		hour_graphics.translate(200, 200);// 进行坐标系统变换,原点设在(200,200)处
		minute_graphics = this.getGraphics();// 实例化分针Graphics对象
		minute_graphics.setColor(Color.blue);// 设置分针的颜色
		minute_graphics.translate(200, 200);// 进行坐标系统变换,原点设在(200,200)处
		second_graphics = this.getGraphics();// 实例化秒针Graphics对象
		second_graphics.setColor(Color.RED);// 设置秒针的颜色
		second_graphics.translate(200, 200);// 进行坐标系统变换,原点设在(200,200)处

		point_x[0] = 0;
		point_y[0] = -120;// 各个时针12点处的位置坐标(按新坐标系的坐标)
		scan_x[0] = 0;
		scan_y[0] = -140;// 12点处的刻度位置坐标(按新坐标系的坐标)
		double jiaodu = 6 * Math.PI / 180;
		for (int i = 0; i < 60; i++) {// 表盘分割成60分,将分割点的坐标存放在数组中
			point_x[i + 1] = point_x[i] * Math.cos(jiaodu) - Math.sin(jiaodu)
					* point_y[i];
			point_y[i + 1] = point_y[i] * Math.cos(jiaodu) + point_x[i]
					* Math.sin(jiaodu);
		}
		point_x[60] = 0;
		point_y[60] = -120;
		for (int i = 0; i < 60; i++) {// 表盘分割成60分,将分割点的坐标存放在绘制数组中
			scan_x[i + 1] = scan_x[i] * Math.cos(jiaodu) - Math.sin(jiaodu)
					* scan_y[i];
			scan_y[i + 1] = scan_y[i] * Math.cos(jiaodu) + Math.sin(jiaodu)
					* scan_x[i];
		}
		scan_x[60] = 0;
		scan_y[60] = -140;
	}

	public void start() {
		if (isStart >= 1) {
			SECOND_THREAD.interrupt();// 唤醒线程
			MINUTE_THREAD.interrupt();
			HOUR_THREAD.interrupt();
		}
		HOUR_THREAD = new Thread(this);// 创建时针线程
		MINUTE_THREAD = new Thread(this);// 创建分针线程
		SECOND_THREAD = new Thread(this);// 创建秒针线程
		SECOND_THREAD.start();// 启动秒针线程
		MINUTE_THREAD.start();// 启动分针线程
		HOUR_THREAD.start();// 启动时针线程
		isStart++;
		if (isStart >= 2)
			isStart = 1;
	}

	public void stop() {
		SECOND_THREAD.interrupt();// 唤醒线程
		MINUTE_THREAD.interrupt();// 唤醒线程
		HOUR_THREAD.interrupt();// 唤醒线程
	}

	public void paint(Graphics g) {// 绘制图形
		this.start();
		g.drawOval(50, 50, 300, 300);// 表盘的外圈
		g.translate(200, 200);// 进行坐标系统变换
		for (int i = 0; i < 60; i++) {// 绘制表盘的小刻度和大刻度
			if (i % 5 == 0) {
				g.setColor(Color.BLACK);// 设置颜色
				g.fillOval((int) scan_x[i], (int) scan_y[i], 10, 10);
			} else
				g.fillOval((int) scan_x[i], (int) scan_y[i], 5, 5);
		}
	}

	public void run() {// 实现Thread的方法,开始线程
		Date date = new Date();// 获取本地时间
		String s = date.toString();
		current_hour = Integer.parseInt(s.substring(11, 13));// 获得当前时间的小时
		current_minute = Integer.parseInt(s.substring(14, 16));// 获取当前时间的分钟
		current_second = Integer.parseInt(s.substring(17, 19));// 获取当前时间的秒钟
		if (Thread.currentThread() == SECOND_THREAD) {// 如果当前线程是秒线程
			second_a = (int) point_x[current_second];// 秒针初始化
			second_b = (int) point_x[current_second];
			second_graphics.drawLine(0, 0, second_a, second_b);// 用背景色清除前一秒的秒针
			second_graphics.drawString("秒", second_a, second_b);
			int i = current_second;
			while (true) {
				try {
					SECOND_THREAD.sleep(1000);// 每隔一秒休眠
					Color c = getBackground();// 获取背景颜色
					second_graphics.setColor(c);// 设置秒针的颜色
					second_graphics.drawLine(0, 0, second_a, second_b);// 用背景色清除前一秒的秒针
					second_graphics.drawString("秒", second_a, second_b);
					if ((second_a == minute_a) && (second_b == minute_b)) {// 如果秒针与分针重合,恢复分针的显示
						minute_graphics.drawLine(0, 0, minute_a, minute_b);// 用背景色清除前一分的分针
						minute_graphics.drawString("分", minute_a, minute_b);
					}
					if ((second_a == hour_a) && (second_b == hour_b)) {// 如果秒针与时针重合,恢复时针的显示
						hour_graphics.drawLine(0, 0, hour_a, hour_b);// 用背景色清除前一时的时针
						hour_graphics.drawString("时", hour_a, hour_b);
					}
				} catch (InterruptedException e) {// 捕获异常
					Color c = getBackground();// 获取背景颜色
					second_graphics.setColor(c);// 设置秒针的颜色
					second_graphics.drawLine(0, 0, second_a, second_b);// 用背景色清除秒针
					second_graphics.drawString("秒", second_a, second_b);
					return;
				}
				second_a = (int) point_x[(i + 1) % 60];// 秒针向前走一个单位
				second_b = (int) point_y[(i + 1) % 60]; // 每一秒走6度(一个单位格)
				second_graphics.setColor(Color.red);// 绘制秒针的颜色
				second_graphics.drawLine(0, 0, second_a, second_b);// 用背景色清除前一秒的秒针
				second_graphics.drawString("秒", second_a, second_b);
				i++;
			}
		}
		if (Thread.currentThread() == MINUTE_THREAD) {// 如果当前线程是分线程
			minute_a = (int) point_x[current_minute];
			minute_b = (int) point_y[current_minute];
			minute_graphics.drawLine(0, 0, minute_a, minute_b);
			int i = current_minute;// 获取当前分钟
			while (true) {
				try {// 第一次过60-second秒就前进一分钟,以后每过60秒前进一分钟
					MINUTE_THREAD.sleep(1000 * 60 - current_second * 1000);
					current_second = 0;
					Color c = getBackground();// 获取背景颜色
					minute_graphics.setColor(c);// 设置分针的颜色
					minute_graphics.drawLine(0, 0, minute_a, minute_b);
					minute_graphics.drawString("分", minute_a, minute_b);

					if ((hour_a == minute_a) && (hour_b == minute_b)) {// 如果时针和分针重合
						hour_graphics.drawLine(0, 0, minute_a, minute_b);
						hour_graphics.drawString("时", hour_a, hour_b);
					}
				} catch (InterruptedException e) {
					return;
				}
				minute_a = (int) point_x[(i + 1) % 60];// 分针向前走一个单位
				minute_b = (int) point_y[(i + 1) % 60];// 每一分走6度(一个单位格)
				minute_graphics.setColor(Color.BLUE);// 绘制分针的颜色
				minute_graphics.drawLine(0, 0, minute_a, minute_b);
				minute_graphics.drawString("分", minute_a, minute_b);
				i++;
				current_second = 0;
			}
		}

		if (Thread.currentThread() == HOUR_THREAD) {// 如果当前线程是时线程
			int h = current_hour % 12;
			hour_a = (int) point_x[h * 5 + current_minute / 12];
			hour_b = (int) point_y[h * 5 + current_minute / 12];
			int i = h * 5 + current_minute / 12;
			hour_graphics.drawLine(0, 0, hour_a, hour_b);
			hour_graphics.drawString("时", hour_a, hour_b);
			while (true) {
				try {// 第一次过12-minute%12分钟就前进一个刻度,以后每过12分钟前进一个刻度
					HOUR_THREAD.sleep(1000 * 60 * 12 - 1000 * 60
							* (current_minute % 12) - current_second * 1000);
					current_minute = 0;
					Color c = getBackground();
					hour_graphics.setColor(c);
					hour_graphics.drawLine(0, 0, hour_a, hour_b);
					hour_graphics.drawString("时", hour_a, hour_b);
				} catch (InterruptedException e) {
					return;
				}
				hour_a = (int) point_x[(i + 1) % 60];
				hour_b = (int) point_y[(i + 1) % 60];
				hour_graphics.setColor(Color.BLACK);
				hour_graphics.drawLine(0, 0, hour_a, hour_b);
				hour_graphics.drawString("时", hour_a, hour_b);
				i++;
				current_minute = 0;
			}
		}
	}
}
分享到:
评论

相关推荐

    Java GUI钟表。。。

    本示例涉及使用Java GUI创建一个钟表,展示时、分、秒三根指针的动态旋转,以反映系统的当前时间,并实时更新指针位置。下面我们将深入探讨这个主题。 首先,我们需要了解Java Swing或JavaFX这两个库,它们提供了...

    一个定时器Timer实现的钟表.doc

    在Java编程中,我们可以使用`java.util.Timer`类来创建定时任务,就像在文档"一个定时器Timer实现的钟表.doc"中所示,该文档描述了一个使用`Timer`类模拟钟表的工作原理。这个程序通过每秒更新一次时间来模拟钟表的...

    用Java实现的网页版电子时钟

    - Java中,可以使用`Thread`类或者实现`Runnable`接口来创建新线程。在这个例子中,我们可能会创建一个单独的线程来周期性地刷新时钟的显示。 - `java.util.Timer`或`java.lang.Thread.sleep()`也可以用来实现定时...

    java 多线程模拟钟表 首创

    在这个模拟钟表的例子中,可能会创建三个线程,分别代表时针、分针和秒针。 创建线程的方式之一是通过继承`Thread`类。例如,我们可以创建三个类,如`HourHandThread`, `MinuteHandThread` 和 `SecondHandThread`,...

    Java数字时钟源代码

    本项目就是这样一个例子,它展示了如何用Java编写一个美观且实用的数字时钟。 数字时钟的基本原理是通过获取系统当前时间,并将其转换为可读的数字格式展示给用户。在Java中,我们通常会使用`java.util.Date`和`...

    j2me的一个简单钟表实现

    "j2me的一个简单钟表实现"这个项目就是一个典型的例子,它展示了如何在有限的资源和界面条件下创建一个实时更新的钟表应用。 J2ME是Java平台的一个子集,专门用于嵌入式设备,如手机、智能手表等,其核心在于提供轻...

    自定义View之钟表

    可以使用`canvas.save()`和`canvas.rotate()`来保存当前画布状态并进行旋转,然后绘制刻度,最后用`canvas.restore()`恢复原始状态。 4. **处理触摸事件**:如果需要交互功能,比如拖动指针,我们需要重写`...

    jFreeChart简单例子

    **jFreeChart简介** jFreeChart是一个开源的Java库,用于生成高质量的图表,支持多种图表...无论你是初学者还是经验丰富的开发者,jFreeChart都为你提供了一套强大且易用的工具,帮助你在Java环境中实现数据的可视化。

    安卓自定义控件相关-安卓自定义View实现钟表--Android.rar

    本文将深入探讨如何在Android平台上实现一个自定义的钟表视图。首先,我们从标题和描述中可以得知,这是一个关于使用Android SDK创建自定义View,模拟钟表运行的项目。 自定义控件通常涉及到以下关键步骤: 1. **...

    Java程序设计PPT教程

    Java程序设计PPT教程主要涵盖了面向对象编程的基本概念和核心机制。Java作为一种强类型、面向对象的语言,它的基本单位是类,类...通过学习和理解这些概念,开发者能够构建出高效、可扩展且易于维护的Java应用程序。

    Android自定义一个属于自己的时间钟表

    本文将深入探讨如何在Android中实现一个自定义的时间钟表,同时优化绘图操作。 首先,自定义视图是Android开发中的一个重要概念,它允许开发者扩展系统提供的基本视图类,以满足特定需求。Android提供了View和...

    自定义钟表

    可以使用`drawCircle()`绘制钟表的中心圆盘,用`drawArc()`画出分界线。通过调整颜色和线宽,可以创建出各种风格的表盘。 7. **绘制指针**: 对于时针、分针和秒针,可以使用`drawLine()`绘制直线,调整长度和...

    canvas 绘制会动的钟表

    这个例子展示了如何使用Canvas的基本绘图操作,如绘制线条和旋转坐标系,以及如何利用Android的View机制来实现动态效果。理解并熟练掌握这些概念对于任何Android开发者来说都是非常重要的,尤其是在创建自定义UI组件...

    Android例子-自定义时钟

    在这个例子中,我们可能会创建一个新的Java类,如`CustomClock`,它继承自`View`。这样,我们就可以重写`onDraw()`方法,这是Android系统用来绘制视图的地方。在`onDraw()`中,我们可以使用`Canvas`对象进行绘图操作...

    系统时间java程序

    在这个例子中,paint方法被用来画一个钟表,通过Graphics对象的drawOval()方法画出钟面,然后根据当前时间计算分钟、小时和秒的角度,使用drawLine()方法画出指针。 画日期列表部分,程序使用了JTable。JTable是...

    亚信java笔试题-tech-knowledge:整理自己的一些githubstars项目和学习记录

    自己整理收集一些内容(努力成为终身学习者) 整理自己的一些 github stars项目 目录 java 库名 简述 分类 备注 Stars 高效的时间工具包 java 时间工具包 一个比较全的maven framework项目(各种例子和教程) 知识库 一...

    ViewPaintColck:自绘的钟表

    本项目“ViewPaintColck”就是一个基于Java实现的自绘钟表的例子,展示了如何利用Android的Canvas和Paint类来创建动态、实时的图形。 首先,我们来看“自绘的钟表”。在Android中,`View`类是所有UI组件的基础,而`...

    javascript canvas实现简易时钟例子

    本文实例为大家分享了javascript canvas实现简易时钟的具体代码,供大家参考,具体内容如下 &lt;!DOCTYPE html&gt; &lt;html lang=en&gt; &lt;head&gt; &lt;meta charset=UTF-8&gt; &lt;meta name=viewport content=...

    Android 圆形时间选择控件

    - **绘制钟表盘面**:使用`Paint`对象设置画笔颜色、样式等属性,然后在`onDraw()`中画出圆形背景,可能是灰色的钟表盘,以及用不同颜色表示的小时和分钟刻度线。数字和刻度线可以使用`drawText()`和`drawLines()`...

    自定义的时间表盘

    在Android中,我们可以使用Calendar或者java.time包中的类来获取当前时间,然后根据时间的小时、分钟、秒来计算指针的位置。例如,我们可以用角度来表示时间,12小时制的表盘360度代表24小时,每小时对应30度,分钟...

Global site tag (gtag.js) - Google Analytics