赞
踩
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的小白们,希望对你们学习面向对象编程有所帮助!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。