java模拟时钟

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.util.Calendar;
import java.util.GregorianCalendar;

import javax.swing.JButton;
import javax.swing.JFrame;

class test extends JFrame
{
	public test()
	{
		setBounds(100, 100, 500, 300);
		setTitle("电子时钟");
		setLocationRelativeTo(null);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		Container c = getContentPane();
		c.setLayout(null);
		
		JButton jb = new JButton("开始计时");
		jb.setBounds(10, 200, 100, 30);
		
		c.add(jb);
		
		jb.addActionListener(new ActionListener() 
		{
			public void actionPerformed(ActionEvent e) 
			{
                Clock clock = new Clock();
                Thread t1 = new Thread(clock);
                t1.start();
			}
		});
	}
	
	public void paint(Graphics g)
	{
		super.paint(g);//调用父类的paint()方法,这样能在画图时能保存外观
		Rectangle rectangle = getBounds();//获得控件的区域
		Insets insets = getInsets();//获得控件的边框
		int radius = 120;//设置圆的半径是120px
		int x = (rectangle.width - 2 * radius - insets.left - insets.right) / 2 + insets .left; //x坐标
		int y = (rectangle.height - 2 * radius - insets.top - insets.bottom) / 2 + insets .top;//y坐标
		Point2D.Double center = new Point2D.Double(x + radius, y + radius);//获得圆心坐标
		g.drawOval(x, y, 2 * radius, 2 * radius);// 绘制圆形
		Point2D.Double[] scales = new Point2D.Double[60];//用60个点保存表盘的刻度
		double angle = Math.PI / 30;//表盘上两个点之间的夹角是PI/30
		
        //下面代码是获得所有刻度的坐标
        for (int i = 0; i < scales.length; i++) 
		{
		    scales[i] = new Point2D.Double();//初始化点对象
		    scales[i].setLocation(x + radius + radius * Math.sin(angle * i),
		    y + radius - radius * Math.cos(angle * i));//利用三角函数计算点的坐标
		}
	    
        //下面代码是画所有刻度
        for (int i = 0; i < scales.length; i++)
	    {
	        if (i % 5 == 0)//如果序号是5则画成大点,这些点相当于石英钟上的数字 
	        {
	           g.setColor(Color.RED);
	           g.fillOval((int) scales[i].x - 4, (int) scales[i].y - 4, 8, 8);
	        } 
	        else//如果序号不是5则画成小点,这些点相当于石英钟上的小刻度 
	        {
	            g.setColor(Color.CYAN);
	            g.fillOval((int) scales[i].x - 2, (int) scales[i].y - 2, 4, 4);
	        }
	    }
	    Calendar calendar = new GregorianCalendar();//创建日期对象
	    int hour = calendar.get(Calendar.HOUR);//获得当前小时数
	    int minute = calendar.get(Calendar.MINUTE);//获得当前分钟数
	    int second = calendar.get(Calendar.SECOND);//获得当前秒数
	    Graphics2D g2d = (Graphics2D)g;
	    g2d.setColor(Color.red);//将颜色设置为红色
	    g2d.draw(new Line2D.Double(center, scales[second]));//绘制秒针
	    BasicStroke bs = new BasicStroke(3f, BasicStroke.CAP_ROUND, BasicStroke .JOIN_MI TER);
	    g2d.setStroke(bs);
	    g2d.setColor(Color.blue);//将颜色设置成蓝色
	    g2d.draw(new Line2D.Double(center, scales[minute]));//绘制分针
	    bs = new BasicStroke(6f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER);
	    g2d.setStroke(bs);
	    g2d.setColor(Color.green);//将颜色设置成绿色
	    g2d.draw(new Line2D.Double(center, scales[hour * 5 + minute / 12]));//绘制时针
	}
	
    //下面代码是编写类ClockRunnable,该类实现了Runnable接口。在run()方法中,每隔一秒钟重新绘制一次图片,由此实现走动的效果
	class Clock implements Runnable
	{
	    public void run() 
	    {
	        while (true) 
	        {
	            repaint();
	            try 
	            {
	            	Thread.sleep(1000);
	            } 
	            catch (InterruptedException e) 
	            {
	                e.printStackTrace();
	            }
	        }
	    }
	}
}

public class test2
{
	public static void main(String[] args)
	{
		test ts = new test();
		ts.setVisible(true);
	}
}

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值