练手:例9-17

                                                       程序练手

      本程序为练手作品,为课本例子9-17 ClockDemo.java,一个时钟的动画程序。

import java.util.*;
import java.awt.*;
import java.applet.*;
import java.text.*;


public class ClockDemo extends Applet implements Runnable{
	Thread timer;
	int lastxs,lastys,lastxm,
	lastym,lastxh,lastyh;
	SimpleDateFormat fm;
	String lastdate;
	Font clockFaceFont;
	Date currentDate;
	Color handColor;
	Color numberColor;
	public void init(){
		int x,y;
		lastxs=lastys=lastxm=lastym=lastxh=lastyh=0;
		fm= new SimpleDateFormat("yyyy EEE MMM dd hh:mm:ss");
		currentDate=new Date();
		lastdate=fm.format(currentDate);
		clockFaceFont=new Font("Serif",Font.PLAIN,14);
		handColor=Color.blue;
		numberColor=Color.darkGray;
		try{
			setBackground(new Color(Integer.parseInt(getParameter("bgcolor"),16)));
           }catch(Exception E){}
		try{
			handColor=new Color (Integer.parseInt(getParameter("fgcolor1"),16));
		}catch(Exception E){ }
		try{
			numberColor=new Color(Integer.parseInt(getParameter("fgcolor2"),16));
		}catch(Exception E){}
		resize(300,300);//设置时钟窗口大小
	}
	//计算1/4的圆弧
	public void plotpoints(int x0,int y0, int x,int y,Graphics g)
	{
		g.drawLine(x0+x, y0+y, x0+x, y0+y);
		g.drawLine(x0+y, y0+x, x0+y, y0+x);
		g.drawLine(x0+y, y0-x, x0+y, y0-x);
		g.drawLine(x0+x, y0-y, x0+x, y0-y);
		g.drawLine(x0-x, y0-y, x0-x, y0-y);
		g.drawLine(x0-y, y0-x, x0-y, y0-x);
		g.drawLine(x0-y, y0+x, x0-y, y0+x);
		g.drawLine(x0-x, y0+y, x0-x, y0+y);
	}
//用Bresenham算法来画圆,其中(x0,y0)是圆的中心,r是半径
public void circle(int x0,int y0,int r,Graphics g)	{
    int x,y;
    float d;
    x=0;
    y=r;
    d=5/4-r;
    plotpoints(x0,y0,x,y,g);
    while(y>x){
    	if(d<0){
    		d=d+2*x+3;
    		x++;
    	       }
    	else{
    		d=d+2*(x-y)+5;
    		x++;
    		y--;
    	}
    	plotpoints(x0,y0,x,y,g);
    }
}

public void paint(Graphics g){
	int xh,yh,xm,ym,xs,ys,s=0,m=10,h=10,xcenter,ycenter;
	String today;
	currentDate=new Date();
	SimpleDateFormat fm=new SimpleDateFormat("s",Locale.getDefault());
	try{
		s=Integer.parseInt(fm.format(currentDate));
	}catch(NumberFormatException n){
		s=0;
	}
	fm.applyPattern("m");
	try{
		m=Integer.parseInt(fm.format(currentDate));
	   }catch(NumberFormatException n){
			m=10;
		}
		fm.applyPattern("h");
		try{
			h=Integer.parseInt(fm.format(currentDate));
		   }
		catch(NumberFormatException n){
			h=10;
            }
		fm.applyPattern("EEE MMM dd HH:mm:ss yyyy");
		today=fm.format(currentDate);
		//设置时钟的表盘的原点为(80,55)
		xcenter=80;
		ycenter=55;
		xs=(int)(Math.cos(s*3.14f/30-3.14f/2)*45+xcenter);
		ys=(int)(Math.sin(s*3.14f/30-3.14f/2)*45+ycenter);
		xm=(int)(Math.cos(m*3.14f/30-3.14f/2)*40+xcenter);
		ym=(int)(Math.sin(m*3.14f/30-3.14f/2)*40+ycenter);
		xh=(int)(Math.cos((h*30+m/2)*3.14f/180-3.14f/2)*30+xcenter);
		yh=(int)(Math.sin((h*30+m/2)*3.14f/180-3.14f/2)*30+ycenter);
		//画时钟最外面的圆盘其中心在(xcenter,ycenter)半径为50
		g.setFont(clockFaceFont);
		g.setColor(handColor);
		circle(xcenter,ycenter,50,g);
		//画时钟表盘里的数字
		g.setColor(numberColor);
		g.drawString("9",xcenter-45,ycenter+3);
		g.drawString("3",xcenter+40,ycenter+3);
		g.drawString("12",xcenter-5,ycenter-37);
		g.drawString("6",xcenter-3,ycenter+45);
		//如果必要的话抹去重画
		g.setColor(getBackground());
		if(xs!=lastxs||ys!=lastys){
		g.drawLine(xcenter,ycenter,lastxs,lastys);
		g.drawString(lastdate,5,125);
		}
		if(xm!=lastxm || ym!=lastym){
		g.drawLine(xcenter,ycenter-1,lastxm,lastym);
		g.drawLine(xcenter-1,ycenter,lastxm,lastym);
		}
		if(xh!=lastxh||yh!=lastyh){
		g.drawLine(xcenter,ycenter-1,lastxh,lastyh);
		g.drawLine(xcenter-1,ycenter,lastxh,lastyh);}
		g.setColor(numberColor);
		g.drawString("",5,125);
		g.drawString(today,5,125);
		g.drawLine(xcenter,ycenter,xs,ys);
		g.setColor(handColor);
		g.drawLine(xcenter,  ycenter-1,xm,ym);
		g.drawLine(xcenter-1,ycenter,xm,ym);
		g.drawLine(xcenter,  ycenter-1,xh,yh);
		g.drawLine(xcenter-1,ycenter,xh,yh);
		lastxs=xs;lastys=ys;
		lastxm=xm;lastym=ym;
		lastxh=xh;lastyh=yh;
		lastdate=today;
		currentDate=null;
		}
		//applet的启动方法
		public void start(){
		timer=new Thread(this);
		timer.start();
		}
		//applet的停止方法
		public void stop(){
			timer=null;
		}
		//线程的run方法
		public void run(){
		Thread me=Thread.currentThread();
		while(timer==me){
		try{
		Thread.currentThread().sleep(1000);
		}
		catch(InterruptedException e){
		}
		repaint();
		}
		}
		//注意:这里重写了update()方法,只是调用了paint()方法来消除闪烁现象
		public void update(Graphics g){
		paint(g);
		}
}

我还按照课本的建立Html文件,不过运行不了,都是因为Java有漏洞,限制了java插件,按照网上的提示做了,没有改变。暂且搁下了


下图为运行结果:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值