ava小程序--多彩时钟表盘的制作
最近闲来无事,就想着用刚学的Java知识编写一些简单的小程序用来练练手。于是在网上搜了一些Java小程序来补充一下思路,就想到了可以用Java来制作一个简单的表盘。但是既然是自己创作,就要搞点不一样的。这就是今天我要分享的内容--多彩时钟表盘的制作。
先简单来说一下具体的功能特点:就是用三中不同的颜色来表示时分秒,三种颜色相当于三个指针,从而通过颜色的不同变化中得知具体的时间。
为了更好的理解我的这个小程序,我特意用PS做了一个草图(如下方所示):
Java自制时钟草图
大概就是这么个样子,话不多说,直接开始写代码。
首先,肯定要先创建一个窗口用来承载我们想要显示的内容:
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;
}
}
最后的运行结果如下图:
运行截图
版权所有© 帮我毕业网 并保留所有权利