Java实现时钟

在理解吸收了http://blog.csdn.net/fengsigaoju/article/details/51327180这位朋友写的代码之后做了一定的美观性的修改。

增加了两个线程,分别用来操作电子风格表盘和日期显示。

package drawClock;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Stroke;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import javax.swing.JPanel;
import javax.swing.text.Highlighter.Highlight;

public class Clock extends JPanel {
	protected Thread thread_dial = null; // 机械型时钟所用线程
	protected Thread thread_electric = null; // 电子型时钟所用线程
	protected Thread thread_date = null; // 日期显示所用线程
	protected static int x_origin = 250, y_origin = 250; // 坐标原点

	protected static int r_hour = 50; // 时针半径
	protected static int r_minute = 75; // 分针半径
	protected static int r_second = 100; // 秒针半径

	double x_hour, y_hour; // 时针所在位置
	double x_minute, y_minute; // 分针所在位置
	double x_second, y_second; // 秒针所在位置

	protected String hour = ""; // 小时读数
	protected String minute = ""; // 分钟读数
	protected String second = ""; // 秒读数
	protected String dot = ""; // 电子式时钟间隔闪烁点

	protected String year = ""; // 年读数
	protected String month = ""; // 月读数
	protected String dayInMonth = ""; // 月中日读数
	protected String dayInWeekCHN = ""; // 周中日汉语
	protected String dash = ""; // 日期中间的破折号

	Color colorOfDay = null;

	public Clock() {
		/* 机械型时钟线程操作 */
		thread_dial = new Thread(new Runnable() {

			@Override
			public void run() {
				while (true) {

					Date date = new Date();
					/* 获取当前时分秒,存入临时变量temp_XX */
					hour = String.format("%tI", date);
					int temp_hour = Integer.parseInt(hour);
					minute = String.format("%tM", date);
					int temp_minute = Integer.parseInt(minute);
					second = String.format("%tS", date);
					int temp_second = Integer.parseInt(second);

					double totalSeconds = 3600 * temp_hour + 60 * temp_minute + 1 * temp_second; // 获得当前时间一共多少秒
					double angle_hour = totalSeconds / 120; // 时针1秒走过1/120°
					angle_hour = Math.toRadians(angle_hour);
					totalSeconds = 60 * temp_minute + temp_second;
					double angle_minute = totalSeconds * 0.1; // 分针1秒走过0.1°
					angle_minute = Math.toRadians(angle_minute);
					double angle_second = temp_second * 6; // 秒针一秒走过6°
					angle_second = Math.toRadians(angle_second);

					/* 根据半径和角度计算指针所在位置 */
					x_hour = r_hour * Math.sin(angle_hour) + x_origin;
					y_hour = r_hour * Math.cos(angle_hour + Math.PI) + y_origin;
					x_minute = r_minute * Math.sin(angle_minute) + x_origin;
					y_minute = r_minute * Math.cos(angle_minute + Math.PI) + y_origin;
					x_second = r_second * Math.sin(angle_second) + x_origin;
					y_second = r_second * Math.cos(angle_second + Math.PI) + y_origin;

					repaint(); // 再次打印界面,相当于每隔1秒刷新一次界面

					try {
						Thread.sleep(1000); // 线程休眠1秒
					} catch (InterruptedException e) {
						e.printStackTrace();
					} // try-catch

				} // while

			} // run()

		});

		/* 电子型时钟线程操作 */
		thread_electric = new Thread(new Runnable() {

			@Override
			public void run() {
				while (true) {
					Date date = new Date();
					/* 获取当前时分秒 */
					hour = String.format("%tI", date);
					minute = String.format("%tM", date);
					second = String.format("%tS", date);

					if (Integer.parseInt(second) % 2 == 0) {
						dot = "";
					} else {
						dot = ":";
					}

					repaint(); // 再次打印界面,相当于每隔1秒刷新一次界面

					try {
						Thread.sleep(1000); // 线程休眠1秒
					} catch (InterruptedException e) {
						e.printStackTrace();
					} // try-catch

				} // while

			} // run()
		});

		/* 日期线程操作 */
		thread_date = new Thread(new Runnable() {

			@Override
			public void run() {
				while (true) {
					Date date = new Date();
					/* 获取当前年月日 */
					year = String.format("%tY", date);
					month = String.format("%tm", date);
					dayInMonth = String.format("%td", date);
					second = String.format("%tS", date);

					String temp = String.format("%ta", date).substring(2, 3);
					switch (temp) {
					case "一":
						dayInWeekCHN = "月";
						colorOfDay = new Color(255, 248, 220);
						break;

					case "二":
						dayInWeekCHN = "火";
						colorOfDay = new Color(255, 69, 0);
						break;

					case "三":
						dayInWeekCHN = "水";
						colorOfDay = new Color(72, 118, 255);
						break;

					case "四":
						dayInWeekCHN = "木";
						colorOfDay = new Color(205, 170, 125);
						break;

					case "五":
						dayInWeekCHN = "金";
						colorOfDay = new Color(255, 215, 0);
						break;

					case "六":
						dayInWeekCHN = "土";
						colorOfDay = new Color(205, 102, 29);
						break;

					case "日":
						dayInWeekCHN = "日";
						colorOfDay = new Color(238, 238, 0);
						break;
					}

					if (Integer.parseInt(second) % 2 == 0) {
						dash = "";
					} else {
						dash = "-";
					}

					repaint(); // 再次打印界面,相当于每隔1秒刷新一次界面

					try {
						Thread.sleep(1000); // 线程休眠1秒
					} catch (InterruptedException e) {
						e.printStackTrace();
					} // try-catch

				} // while

			} // run()
		});

		/* 启动线程 */
		thread_dial.start();
		thread_electric.start();
		thread_date.start();

	} // Clock()

	@Override
	public void paint(Graphics g) {
		Graphics2D g2d = (Graphics2D) g;
		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // 打开反锯齿开关

		int radius = 250; // 表盘半径

		/* 背景设定 */
		g2d.setColor(Color.BLACK); // 背景色设定
		g2d.fillRect(0, 0, 550, 550);

		/* 画电子表显示区 */
		g2d.setStroke(new BasicStroke(5.0f)); // 设定显示框粗细
		g2d.setColor(new Color(132, 112, 255)); // 设定显示框颜色
		g2d.drawRoundRect(95, 30, 300, 60, 30, 30);
		g2d.setColor(new Color(255, 250, 205)); // 设定显示数字颜色
		g2d.setFont(new Font("Highlight LET", Font.PLAIN, 50)); // 显示数字字体设定
		g2d.drawString(hour, 120, 75);
		g2d.drawString(minute, 220, 75);
		g2d.drawString(second, 320, 75);
		g2d.setColor(new Color(255, 250, 205)); // 设置间隔闪烁点的颜色
		g2d.drawString(dot, 200, 70);
		g2d.drawString(dot, 290, 70);

		/* 画日期显示区 */
		g2d.setStroke(new BasicStroke(5.0f)); // 设定显示框粗细
		g2d.setColor(new Color(145, 238, 145)); // 设定显示框颜色
		g2d.drawRoundRect(95, 415, 300, 60, 30, 30);
		g2d.setColor(new Color(255, 165, 79)); // 设定显示数字颜色
		g2d.setFont(new Font("Highlight LET", Font.PLAIN, 50)); // 显示数字字体设定;
		g2d.drawString(year, 120, 460);
		g2d.drawString(month, 255, 460);
		g2d.drawString(dayInMonth, 330, 460);
		g2d.setColor(new Color(255, 165, 79)); // 设置间隔闪烁线的颜色
		g2d.drawString(dash, 227, 460);
		g2d.drawString(dash, 300, 460);

		/* 画表盘刻度 */
		g2d.setColor(new Color(255, 250, 250)); // 设定刻度颜色
		g2d.setFont(new Font("Highlight LET", Font.PLAIN, 23)); // 刻度数字字体设定
		g2d.drawString("12", 245, 145);
		g2d.drawString("3", 358, 255);
		g2d.drawString("6", 250, 370);
		g2d.drawString("9", 130, 255);

		/* 画表面 */
		g2d.setStroke(new BasicStroke(5.0f)); // 设定表盘粗细
		g2d.setColor(new Color(135, 206, 250)); // 设定表盘颜色
		g2d.drawOval(125, 125, radius, radius);

		/* 画指针 */
		Stroke stroke_line = new BasicStroke(4.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND); // 设定指针粗细
		g2d.setStroke(stroke_line);
		g2d.setColor(new Color(144, 238, 144)); // 设定时针颜色
		g2d.drawLine(x_origin, y_origin, (int) x_hour, (int) y_hour);
		g2d.setColor(new Color(255, 250, 205)); // 设定分针颜色
		g2d.drawLine(x_origin, y_origin, (int) x_minute, (int) y_minute);
		g2d.setColor(new Color(255, 99, 71)); // 设定秒针颜色
		g2d.drawLine(x_origin, y_origin, (int) x_second, (int) y_second);

		/* 画曜日左显示区 */
		g2d.setStroke(new BasicStroke(5.0f)); // 设定显示框粗细
		g2d.setColor(colorOfDay); // 设定显示框颜色
		g2d.drawRoundRect(20, 210, 80, 80, 30, 30);
		g2d.setColor(colorOfDay); // 设定显示字体颜色
		g2d.setFont(new Font("华文彩云", Font.BOLD, 50)); // 显示字体设定;
		g2d.drawString(dayInWeekCHN, 35, 265);

		/* 画曜日右显示区 */
		g2d.setStroke(new BasicStroke(5.0f)); // 设定显示框粗细
		g2d.setColor(colorOfDay); // 设定显示框颜色
		g2d.drawRoundRect(400, 210, 80, 80, 30, 30);
		g2d.setColor(colorOfDay); // 设定显示字体颜色
		g2d.setFont(new Font("华文彩云", Font.BOLD, 50)); // 显示字体设定;
		g2d.drawString(dayInWeekCHN, 415, 265);

		/* 画表心 */
		g2d.setColor(new Color(218, 112, 214)); // 设定内圈颜色
		g2d.fillOval(246, 245, 10, 10);
		g2d.setColor(new Color(135, 206, 250)); // 设定外圈颜色
		g2d.setStroke(new BasicStroke(3.0f)); // 设定外圈粗细
		g2d.drawOval(246, 245, 10, 10);

	} // paintClock

} // class Clock


package drawClock;

import javax.swing.JFrame;

public class Operate extends JFrame {

	public Operate() {
		setTitle("黑色风格时钟");
		setVisible(true);
		setLayout(null);
		setResizable(false);
		setBounds(200, 200, 510, 550);

		Clock clock = new Clock();
		clock.setBounds(0, 0, 510, 550);
		getContentPane().add(clock);
	} // Operate()

	public static void main(String[] args) {
		Operate run = new Operate();
		

	} // main()

}


最终运行效果如图所示:



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值