第5周作业-时钟动画程序

经过下午和晚上的努力,把时钟动画程序做了出来;参考了下教程里面的程序和《Java语言程序设计》里的程序;

然后更加简化和容易的做了出来。

出现问题:1、使用Calendar 的子类 GregorianCalendar 时是星期是从1开始的(1-星期天,2星期一.......);月份是从0开始计算的(0 - 一月,1 - 二月........) ;不知道如何改!

                    2、界面修改了,有点美观了。

  下载图片

/* 程序功能:实现简单的时钟动画程序,显示当前时间
 * 作者:李家华 
 * 时间:2014.04.02 
 * QQ:*********联系博客 
 * */

import java.applet.Applet;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.Calendar;
import java.util.GregorianCalendar;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ClockDemo extends JFrame {

	public ClockDemo()
	{
		ClockPanel jp_clock=new ClockPanel();  
		add(jp_clock);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(400,400);
		//pack();
		setTitle("简单的时钟动画");
		this.setLocationRelativeTo(null);     //设置窗体居中显示
		setVisible(true);
		Thread ClockRun=new Thread(jp_clock);  //用于显示时钟的线程 
		ClockRun.start();
	}
	public static void main(String[] args) {
		// TODO Auto-generatedmethod stub
		new ClockDemo();
	}
}
class ClockPanel extends JPanel implements Runnable
{
	private double CenterX,CenterY; //设置时钟的表盘的中心点
	private double Radius=150;      //设置时钟圆半径
	private double HPointX,HPointY,MPointX,MPointY,SPointX,SPointY;   //时针、分针、秒针的坐标
	private int Year,Month,Day,WeekDay,Hour,Minute,Second;  
	private final double PI=3.1415926;  
	public synchronized void paintComponent(Graphics g)   //绘制面板里的时钟内容
	{
		super.paintComponent(g);
		this.setBackground(Color.LIGHT_GRAY);
		CenterX=this.getWidth()/2;
		CenterY=this.getHeight()/2;

		double HRadian=(PI/6)*Hour+(PI/360)*Minute+(PI/21600)*Second;    //各个指针的弧度
		double MRadian=(PI/30)*Minute+(PI/1800)*Second;
		double SRadian=(PI/30)*Second;
		HPointX=CenterX+Radius*0.6*Math.sin(HRadian);
		HPointY=CenterY-Radius*0.6*Math.cos(HRadian);
		MPointX=CenterX+Radius*0.8*Math.sin(MRadian);
		MPointY=CenterY-Radius*0.8*Math.cos(MRadian);
		SPointX=CenterX+Radius*Math.sin(SRadian);
		SPointY=CenterY-Radius*Math.cos(SRadian);

		Font cf = new Font("Srrif", Font.PLAIN,15);
		g.drawOval((int)(CenterX-Radius), (int)(CenterY-Radius), (int)(2*Radius),(int)(2*Radius));//画时钟椭圆
		g.setColor(Color.BLUE);
		g.setFont(cf);

		g.drawString("12",(int)(CenterX),(int)(CenterY-Radius)+10);      //画时钟表盘里的数字
		g.drawString("3",(int)(CenterX+Radius)-6 , (int)(CenterY));
		g.drawString("6", (int)(CenterX), (int)(CenterY+Radius));
		g.drawString("9",(int)(CenterX-Radius), (int)(CenterY));
		g.setColor(Color.RED);
		
		//绘图
		Image img = null;
		try {
			img = ImageIO.read(new File("723280_140551276000_2.jpg"));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		g.drawImage( img , 0, 0,this);
		
		g.drawLine((int)(CenterX), (int)(CenterY), (int)(SPointX), (int)(SPointY));//画线
		g.drawLine((int)(CenterX), (int)(CenterY), (int)(MPointX), (int)(MPointY));
		g.drawLine((int)(CenterX), (int)(CenterY), (int)(HPointX), (int)(HPointY));

		g.drawString("星期"+WeekDay+"  "+Month+"月"+" "+Day+"号"+" "+" 时间是: "+Hour+":"+Minute+":"+Second+"   "+Year+"年", 20, 350);

	}
	@Override
	public void run() {   //时钟运行时启动线程的run方法
		// TODO Auto-generatedmethod stub
		while(true)
		{
			try {
				setCurrentTime();   //调用下面的setCurrentTime方法
				repaint();
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}
	}

	public void setCurrentTime()
	{
		Calendar calendar=new GregorianCalendar();   //使用calendar类实现
		Year=calendar.get(Calendar.YEAR);
		Month=calendar.get(Calendar.MONTH);
		Day=calendar.get(Calendar.DAY_OF_MONTH);
		WeekDay=calendar.get(Calendar.DAY_OF_WEEK);
		Hour=calendar.get(Calendar.HOUR);
		Minute=calendar.get(Calendar.MINUTE);
		Second=calendar.get(Calendar.SECOND);

	}
}

优化修改后




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值