当前位置:   article > 正文

Java小程序--多彩时钟表盘的制作_java写一个炫酷的数字罗盘时钟

java写一个炫酷的数字罗盘时钟

Java小程序–多彩时钟表盘的制作
最近闲来无事,就想着用刚学的Java知识编写一些简单的小程序用来练练手。于是在网上搜了一些Java小程序来补充一下思路,就想到了可以用Java来制作一个简单的表盘。但是既然是自己创作,就要搞点不一样的。这就是今天我要分享的内容–多彩时钟表盘的制作。
先简单来说一下具体的功能特点:就是用三中不同的颜色来表示时分秒,三种颜色相当于三个指针,从而通过颜色的不同变化中得知具体的时间。
为了更好的理解我的这个小程序,我特意用PS做了一个草图(如下方所示):
自制程序草图
大概就是这么个样子,话不多说,直接开始写代码。

首先,肯定要先创建一个窗口用来承载我们想要显示的内容:	
  • 1
		JFrame j = new JFrame("圆点时钟");
		j.setLocation(420,85);
		j.setSize(518, 543);
		j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		j.setVisible(true);
  • 1
  • 2
  • 3
  • 4
  • 5

简单几行代码,窗口就创建完成了。由于Java是面向对象编程,所以我们必须以面向对象的思想来进行下面具体功能的实现。

通过上面那个草图我们可以看出来,表盘分为圆盘轮廓、12个圆点刻度以及圆盘里面的文字三部分。
由于我们要固定圆点的位置,所以要创建一个圆点类,类里面要有圆点的横纵坐标,代码如下:
  • 1
  • 2
class myCircle {//创建圆点类,定义横纵坐标属性
	double x;
	double y;
	
	public myCircle() {
		x = 0;
		y = 0;
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
接下来就要创建圆点类对象来固定12个圆点刻度在圆盘中的位置,这个也是十分简单的,要经过一些
计算。但是我嫌计算过于麻烦,还要牵扯到圆周率,就没有使用for循环进行计算,直接通过精确的
数值一次对其作了位置确定。代码如下:
  • 1
  • 2
  • 3
//固定12个圆点在表盘中的位置(用循环计算实在是麻烦,就一个一个来确定位置了)
		mc[0].x = circlePart * 3;
		mc[0].y = 0;
		
		mc[1].x = circlePart * 4.5;
		mc[1].y = circlePart * 0.5;
		
		mc[2].x = circlePart * 5.4;
		mc[2].y = circlePart * 1.5;
		
		mc[3].x = circlePart * 6 - PaintTime.littleCIRCLE_D;
		mc[3].y = circlePart * 3;
		
		mc[4].x = circlePart * 5.4;
		mc[4].y = circlePart * 4.3;
		
		mc[5].x = circlePart * 4.5;
		mc[5].y = circlePart * 5.3;
		
		mc[6].x = circlePart * 3;
		mc[6].y = circlePart * 6 - PaintTime.littleCIRCLE_D;
		
		mc[7].x = circlePart * 1.3;
		mc[7].y = circlePart * 5.3;
		
		mc[8].x = circlePart * 0.4;
		mc[8].y = circlePart * 4.3;
		
		mc[9].x = 0;
		mc[9].y = circlePart * 3;
		
		mc[10].x = circlePart * 0.4;
		mc[10].y = circlePart * 1.5;
		
		mc[11].x = circlePart * 1.3;
		mc[11].y = circlePart * 0.5;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
其中三个变量值为我定义的圆盘直径、圆点刻度直径和圆盘经过分割后的平均直径:
  • 1
public static final int CIRCLE_D = 500;//圆盘的直径
public static final int littleCIRCLE_D = 20;//小圆点的直径

double circlePart = PaintTime.CIRCLE_D / 6;//将圆盘直径平均分为6等份
  • 1
  • 2
  • 3
  • 4
接下来就是获取时间并将时间转换成三种颜色显示在圆盘上,也可以在圆盘内部添加解释内容和作者
名字以及其他想添加的内容。具体代码如下,此代码片段也是该小程序的核心代码。
  • 1
  • 2
@SuppressWarnings("deprecation")
	public void paint(Graphics g) {
		
		Date date = new Date();
		SimpleDateFormat ft = new SimpleDateFormat("hh:mm:ss");//设置当前时间格式为 时:分:秒
		
		//设置画笔
		super.paint(g);
		g.setColor(Color.BLACK);
		g.setFont(new Font("宋体", Font.BOLD,15));
		
		g.drawOval(0, 0, PaintTime.CIRCLE_D, PaintTime.CIRCLE_D);//画圆盘轮廓
		
		String s1 = "当前时间:";
		String s2 = ft.format(date).toString();//获取当前时间,格式为"hh:mm:ss"
		
		String s3 = "表示时针";
		String s4 = "表示分针";
		String s5 = "表示秒针";
		
		String s6 = "Designed by Anthony-Z";
		
		//画显示文字和显示时间
		g.drawRect(180, 240, 160, 30);
		g.drawString(s1, 190, 260);
		g.drawString(s2, 260, 260);
		
		//显示3颜色注释以及开发作者
		g.setColor(Color.RED);
		g.fillOval(230, 300, 10, 10);
		g.setColor(Color.GREEN);
		g.fillOval(230, 320, 10, 10);
		g.setColor(Color.YELLOW);
		g.fillOval(230, 340, 10, 10);
		
		g.setColor(Color.BLACK);
		g.setFont(new Font("宋体", Font.ITALIC, 10));
		g.drawString(s3, 250, 310);
		g.drawString(s4, 250, 330);
		g.drawString(s5, 250, 350);
		
		g.setFont(new Font("华文行楷", Font.CENTER_BASELINE ,12));
		g.drawString(s6, 200, 220);
		
		//获取当前时间为int类型
		hour = date.getHours();
		min = date.getMinutes();
		sec = date.getSeconds();
		
		if(hour >= 12){
			hour = hour - 12;//让其一直保持12制格式
		}
		
		for(int i = 0; i < mc.length ; i++){//画12个圆点
			
			if(hour == i){//判断时钟刻度是否指到该指针,如果是,给其强调颜色为红色
				g.setColor(Color.RED);
				g.fillOval((int)mc[i].x, (int)mc[i].y, 20, 20);
				
			}else if(min / 5 == i){//判断分钟刻度是否指到该指针,如果是,给其强调颜色为绿色
				g.setColor(Color.GREEN);
				g.fillOval((int)mc[i].x, (int)mc[i].y, 20, 20);
				
			}else if(sec / 5 == i){//判断秒钟刻度是否指到该指针,如果是,给其强调颜色为黄色
				g.setColor(Color.YELLOW);
				g.fillOval((int)mc[i].x, (int)mc[i].y, 20, 20);
				
			}else{//如果都不符合,则显示为普通黑色
				g.setColor(Color.BLACK);
				g.fillOval((int)mc[i].x, (int)mc[i].y, 20, 20);
			}
			
		}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
因为要想让表盘走动,必须要进行重绘,我这里设置的是每100ms重回一次,代码如下:
  • 1
Timer time = new Timer();
	public void action(){
		time.schedule(new TimerTask(){
			public void run(){
				repaint();//每隔100ms重绘一次
			}
		},100,100);
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

**由于程序比较简单,但其中有些细节或者代码片段没有说到,故附上源代码分享给大家
**

源代码如下:
  • 1
package paintTime;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * 制作多彩时钟圆盘
 * 功能:用3中不同的颜色来表示时分秒,三种颜色相当于三个指针
 * 实现:窗口、圆盘、12个刻度圆点、色彩处理、时间显示
 * @author Anthony-Z【旭】
 *
 */

public class PaintTime {

	public static final int CIRCLE_D = 500;//圆盘的直径
	public static final int littleCIRCLE_D = 20;//小圆点的直径
	
	public static void main(String[] args) {
		
		//创建窗口并把画板添加到窗口中
		JFrame j = new JFrame("圆点时钟");
		Mytime m = new Mytime();
		j.setLocation(420,85);
		j.setSize(518, 543);
		m.action();
		j.add(m);
		j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		j.setVisible(true);
	}
}

class Mytime extends JPanel{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	double circlePart = PaintTime.CIRCLE_D / 6;
	myCircle[] mc = new myCircle[12];//12个圆点
	
	int hour;
	int min;
	int sec;
	
	
	public Mytime() {
		
		for (int i = 0; i < mc.length; i++) {
			mc[i] = new myCircle();
			
		}
		
		//固定12个圆点在表盘中的位置(用循环计算实在是麻烦,就一个一个来确定位置了)
		mc[0].x = circlePart * 3;
		mc[0].y = 0;
		
		mc[1].x = circlePart * 4.5;
		mc[1].y = circlePart * 0.5;
		
		mc[2].x = circlePart * 5.4;
		mc[2].y = circlePart * 1.5;
		
		mc[3].x = circlePart * 6 - PaintTime.littleCIRCLE_D;
		mc[3].y = circlePart * 3;
		
		mc[4].x = circlePart * 5.4;
		mc[4].y = circlePart * 4.3;
		
		mc[5].x = circlePart * 4.5;
		mc[5].y = circlePart * 5.3;
		
		mc[6].x = circlePart * 3;
		mc[6].y = circlePart * 6 - PaintTime.littleCIRCLE_D;
		
		mc[7].x = circlePart * 1.3;
		mc[7].y = circlePart * 5.3;
		
		mc[8].x = circlePart * 0.4;
		mc[8].y = circlePart * 4.3;
		
		mc[9].x = 0;
		mc[9].y = circlePart * 3;
		
		mc[10].x = circlePart * 0.4;
		mc[10].y = circlePart * 1.5;
		
		mc[11].x = circlePart * 1.3;
		mc[11].y = circlePart * 0.5;
	}
	
		
	
	@SuppressWarnings("deprecation")
	public void paint(Graphics g) {
		
		Date date = new Date();
		SimpleDateFormat ft = new SimpleDateFormat("hh:mm:ss");//设置当前时间格式为 时:分:秒
		
		//设置画笔
		super.paint(g);
		g.setColor(Color.BLACK);
		g.setFont(new Font("宋体", Font.BOLD,15));
		
		g.drawOval(0, 0, PaintTime.CIRCLE_D, PaintTime.CIRCLE_D);//画圆盘轮廓
		
		String s1 = "当前时间:";
		String s2 = ft.format(date).toString();//获取当前时间,格式为"hh:mm:ss"
		
		String s3 = "表示时针";
		String s4 = "表示分针";
		String s5 = "表示秒针";
		
		String s6 = "Designed by Anthony-Z";
		
		//画显示文字和显示时间
		g.drawRect(180, 240, 160, 30);
		g.drawString(s1, 190, 260);
		g.drawString(s2, 260, 260);
		
		//显示3颜色注释以及开发作者
		g.setColor(Color.RED);
		g.fillOval(230, 300, 10, 10);
		g.setColor(Color.GREEN);
		g.fillOval(230, 320, 10, 10);
		g.setColor(Color.YELLOW);
		g.fillOval(230, 340, 10, 10);
		
		g.setColor(Color.BLACK);
		g.setFont(new Font("宋体", Font.ITALIC, 10));
		g.drawString(s3, 250, 310);
		g.drawString(s4, 250, 330);
		g.drawString(s5, 250, 350);
		
		g.setFont(new Font("华文行楷", Font.CENTER_BASELINE ,12));
		g.drawString(s6, 200, 220);
		
		//获取当前时间为int类型
		hour = date.getHours();
		min = date.getMinutes();
		sec = date.getSeconds();
		
		if(hour >= 12){
			hour = hour - 12;//让其一直保持12制格式
		}
		
		for(int i = 0; i < mc.length ; i++){//画12个圆点
			
			if(hour == i){//判断时钟刻度是否指到该指针,如果是,给其强调颜色为红色
				g.setColor(Color.RED);
				g.fillOval((int)mc[i].x, (int)mc[i].y, 20, 20);
				
			}else if(min / 5 == i){//判断分钟刻度是否指到该指针,如果是,给其强调颜色为绿色
				g.setColor(Color.GREEN);
				g.fillOval((int)mc[i].x, (int)mc[i].y, 20, 20);
				
			}else if(sec / 5 == i){//判断秒钟刻度是否指到该指针,如果是,给其强调颜色为黄色
				g.setColor(Color.YELLOW);
				g.fillOval((int)mc[i].x, (int)mc[i].y, 20, 20);
				
			}else{//如果都不符合,则显示为普通黑色
				g.setColor(Color.BLACK);
				g.fillOval((int)mc[i].x, (int)mc[i].y, 20, 20);
			}
			
		}
		
	}
	
	Timer time = new Timer();
	public void action(){
		time.schedule(new TimerTask(){
			public void run(){
				repaint();//每隔100ms重绘一次
			}
		},100,100);
	}
}

class myCircle {//创建圆点类,定义横纵坐标属性
	double x;
	double y;
	
	public myCircle() {
		x = 0;
		y = 0;
	}
}


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
最后的运行结果如下图:
  • 1

在这里插入图片描述
相比较我的草图还算可以!

程序比较简单,但是毕竟是靠自己一点一点码出来的,所以有不足之处还请看到的大佬指正。本人刚学Java不久,所以将自己的一点经验分享给刚入Java的小白们,希望对你们学习面向对象编程有所帮助!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/268962
推荐阅读
相关标签
  

闽ICP备14008679号