Java图形编程与事件驱动----动态钟表

    学习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);
	}

}

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值