Java小程序--多彩时钟表盘的制作

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

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

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

通过上面那个草图我们可以看出来,表盘分为圆盘轮廓、12个圆点刻度以及圆盘里面的文字三部分。
由于我们要固定圆点的位置,所以要创建一个圆点类,类里面要有圆点的横纵坐标,代码如下:
class myCircle {//创建圆点类,定义横纵坐标属性
	double x;
	double y;
	
	public myCircle() {
		x = 0;
		y = 0;
	}
}
接下来就要创建圆点类对象来固定12个圆点刻度在圆盘中的位置,这个也是十分简单的,要经过一些
计算。但是我嫌计算过于麻烦,还要牵扯到圆周率,就没有使用for循环进行计算,直接通过精确的
数值一次对其作了位置确定。代码如下:
//固定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;
其中三个变量值为我定义的圆盘直径、圆点刻度直径和圆盘经过分割后的平均直径:
public static final int CIRCLE_D = 500;//圆盘的直径
public static final int littleCIRCLE_D = 20;//小圆点的直径

double circlePart = PaintTime.CIRCLE_D / 6;//将圆盘直径平均分为6等份
接下来就是获取时间并将时间转换成三种颜色显示在圆盘上,也可以在圆盘内部添加解释内容和作者
名字以及其他想添加的内容。具体代码如下,此代码片段也是该小程序的核心代码。
@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);
			}
			
		}
因为要想让表盘走动,必须要进行重绘,我这里设置的是每100ms重回一次,代码如下:
Timer time = new Timer();
	public void action(){
		time.schedule(new TimerTask(){
			public void run(){
				repaint();//每隔100ms重绘一次
			}
		},100,100);
	}

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

源代码如下:
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;
	}
}


最后的运行结果如下图:

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值