学习Java有一段时间了,响应老师的号召,做了这一个动态钟表程序。其中,StillClock.java主要实现钟表的外观,ClockAnimation.java使钟表与系统时间始终保持同步。实现结果如下所示:
下面是具体实现部分:
StillClock.java
import java.awt.*;
import javax.swing.*;
import java.util.*;
public class StillClock extends JPanel
{
private int hour;
private int minute;
private int second;
public StillClock()
{
setCurrentTime();
}
public StillClock(int hour,int minute,int second)
{
this.hour=hour;
this.minute=minute;
this.second=second;
}
public int getHour()
{
return hour;
}
public void setHour(int hour)
{
this.hour=hour;
repaint();
}
public int getMinute()
{
return minute;
}
public void setMinute(int minute)
{
this.minute=minute;
repaint();
}
public int getSecond()
{
return second;
}
public void setSecond(int second)
{
this.second=second;
repaint();
}
//重载paintComponent函数
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
//初始化钟表参数
int clockRadius=(int)(Math.min(getWidth(),getHeight()*0.8*0.5));
int xCenter=getWidth()/2;
int yCenter=getHeight()/2;
//画表盘
g.setColor(Color.black);
g.drawOval(xCenter-clockRadius,yCenter-clockRadius,2*clockRadius,2*clockRadius);
//画表盘的数字和刻度
for(int i=1;i<=12;i++)
{
int xStart=(int)(xCenter+0.9*clockRadius*Math.sin(Math.PI/6*i));
int yStart=(int)(yCenter-0.9*clockRadius*Math.cos(Math.PI/6*i));
int xEnd=(int)(xCenter+clockRadius*Math.sin(Math.PI/6*i));
int yEnd=(int)(yCenter-clockRadius*Math.cos(Math.PI/6*i));
g.setColor(Color.black);
g.drawLine(xStart,yStart,xEnd,yEnd);
Integer integer=new Integer(i);
switch (i)
{
case 1:
g.drawString("1",xStart-5,yStart+5);
break;
case 2:
g.drawString("2",xStart-5,yStart+8);
break;
case 3:
g.drawString("3",xCenter+clockRadius-20,yCenter+5);
break;
case 4:
g.drawString("4",xStart-6,yStart+5);
break;
case 5:
g.drawString("5",xStart-5,yStart);
break;
case 6:
g.drawString("6",xCenter-3,yCenter+clockRadius-15);
break;
case 7:
g.drawString("7",xStart,yStart);
break;
case 8:
g.drawString("8",xStart,yStart);
break;
case 9:
g.drawString("9",xCenter-clockRadius+15,yCenter+5);
break;
case 10:
g.drawString("10",xStart,yStart+5);
break;
case 11:
g.drawString("11",xStart,yStart+5);
break;
case 12:
g.drawString("12",xCenter-6,yCenter-clockRadius+22);
break;
}
}
for(int i=0;i<60;i++)
{
int xStart=(int)(xCenter+0.95*clockRadius*Math.sin(Math.PI/30*i));
int yStart=(int)(yCenter-0.95*clockRadius*Math.cos(Math.PI/30*i));
int xEnd=(int)(xCenter+clockRadius*Math.sin(Math.PI/30*i));
int yEnd=(int)(yCenter-clockRadius*Math.cos(Math.PI/30*i));
g.setColor(Color.black);
g.drawLine(xStart,yStart,xEnd,yEnd);
}
//画秒针
int sLength=(int)(clockRadius*0.8);
int xSecond=(int)(xCenter+sLength*Math.sin(second*(2*Math.PI/60)));
int ySecond=(int)(yCenter-sLength*Math.cos(second*(2*Math.PI/60)));
g.setColor(Color.red);
g.drawLine(xCenter,yCenter,xSecond,ySecond);
//画分针
int mLength = (int)(clockRadius * 0.60);
int xMinute = (int)(xCenter + mLength *Math.sin(minute * (2 * Math.PI / 60)));
int yMinute = (int)(yCenter - mLength *Math.cos(minute * (2 * Math.PI / 60)));
g.setColor(Color.blue);
g.drawLine(xCenter, yCenter, xMinute, yMinute);
//画时针
int hLength = (int)(clockRadius * 0.45);
int xHour = (int)(xCenter + hLength *Math.sin((hour % 12 + minute / 60.0) * (2 * Math.PI / 12)));
int yHour = (int)(yCenter - hLength *Math.cos((hour % 12 + minute / 60.0) * (2 * Math.PI / 12)));
g.setColor(Color.green);
g.drawLine(xCenter, yCenter, xHour, yHour);
//数字显示时间
g.setColor(Color.blue);
g.setFont(new Font("Courier",Font.BOLD,16));
g.drawString(hour+":"+minute+":"+second,(int)(0.8*getWidth()/2),getHeight()-10);
}
//设置当前时间
public void setCurrentTime()
{
//获取当前时间
Calendar calendar=new GregorianCalendar();
this.hour=calendar.get(Calendar.HOUR_OF_DAY);
this.minute=calendar.get(Calendar.MINUTE);
this.second=calendar.get(Calendar.SECOND);
}
public Dimension getPreferredSize()
{
return new Dimension(200,200);
}
}
ClockAnimation.java
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
public class ClockAnimation extends StillClock{
public ClockAnimation()
{
Timer timer=new Timer(1000,new TimerListener());
timer.start();
}
private class TimerListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
setCurrentTime();
repaint();
}
}
/**
* @param args
*/
public static void main(String[] args) {
JFrame frame=new JFrame("ClockAnimation");
ClockAnimation clock=new ClockAnimation();
frame.add(clock);
frame.setSize(300,350);
frame.setLocationRelativeTo(null);//center
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}