new Timer(delay1,drawClock1).start(); } }
这里主要用来在创建时钟主窗口以及为给是添加监视器啊使其能够完成整点报时的功能。
DrawClock.java
import javax.swing.*; import java.awt.*;
import java.util.Calendar;
import java.util.GregorianCalendar; import java.io.*; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.util.Date;
public class DrawClock extends JPanel{
//参数定义区 int
x,y,x0,y0,r,h,w,olds_x=-100,olds_y,oldm_x,oldm_y,oldh_x,oldh_y,hh,old_h;//x0,y0圆心
double ang,mm,ss,old_m;
final double RAD=Math.PI/180;//定义弧度、角度转换常数 JButton set;//\设置\按钮 Icon icon;//按钮图片
//DrawClock构造方法 public DrawClock(){
java.awt.event.ActionListener; import
java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import
this.setLayout(null);//设置布局为空 icon=new ImageIcon(\ set=new JButton(icon);
set.setMnemonic(KeyEvent.VK_ALT);//设置按钮快捷键为:“Alt” set.setSize(30,30);//按钮大小
add(set);
set.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ try {
Process p=Runtime.getRuntime().exec( \//调用Windows时间设置
//按钮添加监听
Timedate.cpl\
}
catch(Exception m){}
}
});
//添加计时器 时间间隔为0.1s int delay = 100;
ActionListener drawClock = new ActionListener(){ public void actionPerformed(ActionEvent evt){
new Timer(delay,drawClock).start(); }
//绘制图像
public void paint(Graphics g){
//参数定义区
Graphics2D g2D = (Graphics2D)g;
repaint();//重画界面
} };
//L和T分别是窗口边缘宽度的一半 h = getSize().height;//h为窗口高度 w = getSize().width; g2D.setColor(Color.white); //设置前景色
r=h/2-30;//计算半径r的值 x0=w/2+35;
y0=h/2+10; //计算圆心坐标 int fs = r/7; //计算字体大小 //调整窗口大小使合适
//获取当前时间
Calendar now=Calendar.getInstance() ; int nowh= now.get(Calendar.HOUR_OF_DAY); int nowm= now.get(Calendar.MINUTE); int nows= now.get(Calendar.SECOND); int noww= now.get(Calendar.DAY_OF_WEEK);
//绘制时钟上的60个点
g2D.setStroke(new BasicStroke((1+h/100)/2)); for(int i=1;i<=60;i++){ x=(int)(r*Math.cos(RAD*ang)+x0); y=(int)(r*Math.sin(RAD*ang)+y0); g.setColor(Color.BLACK); g.drawLine(x,y,x,y); ang-=6;
}
//绘制时钟上的12个数
for(int i=12,ang=270;i>=1;i--){ g.setFont(new Font(\Unicode\
x=(int)((r-15)*Math.cos(RAD*ang)+x0);
Sans
y=(int)((r-15)*Math.sin(RAD*ang)+y0); g.drawString(\ang-=30;
}
//绘制时钟上的12个点 ang=60;
g2D.setStroke(new BasicStroke(1+h/100)); for(int i=1;i<=12;i++){
x=(int)(r*Math.cos(RAD*ang)+x0); y=(int)(r*Math.sin(RAD*ang)+y0); g.drawLine(x,y,x,y); ang-=30; }
//在窗体上显示时间 String st;
if(nowh<10) st=\ if(nows%2==0) st+=\ if(nowm<10) st+=\
g.setFont(new Font(\ g.setColor(new Color(180,180,180,180)); g.drawString(\ g.setColor(Color.BLACK);
g.drawString(st,x0-r*3/2,y0-r+fs/2); //在窗体显示秒数
if(nows<10)
g.setFont(new Font(\Mono\样式常量
g.setColor(new Color(180,180,180,180)); g.drawString(\ g.setColor(Color.BLACK);
g.drawString(st,x0-fs/2,2*r/3+y0);
st=\
else st=\
//显示AM、PM
if(nowh<12) st=\
g.setFont(new Font(\ g.setColor(Color.BLACK);
g.drawString(st,x0-fs/2,y0-2*r/3+3*fs/4); //显示星期
switch (noww) {
g.setFont(new Font(\ g.setColor(Color.BLACK);
g.drawString(st,x0-r*3/2,y0-r+3*fs/2); //计算指针与度数的关系 if(h>=150){ ss=90-nows*6;
mm=90-nowm*6-(0.1*nows); hh=90-nowh*30-nowm/2;
//擦除秒针
g2D.setStroke(new BasicStroke(2f)); if(olds_x>0){
g.setColor(getBackground());
g.drawLine(x0,y0,olds_x,2*y0-olds_y); case 1: st=\case 2: st=\case 3: st=\case 4: st=\case 5: st=\case 6: st=\case 7: st=\
}
} else{
old_m = mm; old_h = hh;