zoukankan      html  css  js  c++  java
  • Java实现时钟

    一、核心的表达式

    因为需要动态显示小时的指针、分钟的指针、秒的指针的位置,所以确认三个指针的角度非常重要; 

    X:三个指针相交的原点的X坐标;

    Y:三个指针相交的原点的Y坐标;

    HOUR_LENGTH、MINUTE_LENGTH、SECOND_LENGTH表示时针、分针、秒针的长度;

    hour、minute、second表示现在是几时、几分、几秒;  

    hourLine.x2 = X+HOUR_LENGTH*Math.cos(hour*(Math.PI/6)-Math.PI/2);
    hourLine.y2 = Y+HOUR_LENGTH*Math.sin(hour*(Math.PI/6)-Math.PI/2);
    minLine.x2 = X+MINUTE_LENGTH*Math.cos(minute*(Math.PI/30)-Math.PI/2);
    minLine.y2 = Y+MINUTE_LENGTH*Math.sin(minute*(Math.PI/30)-Math.PI/2);
    secondLine.x2 = X+SECOND_LENGTH*Math.cos(second*(Math.PI/30)-Math.PI/2);
    secondLine.y2 = Y+SECOND_LENGTH*Math.sin(second*(Math.PI/30)-Math.PI/2);

    二、怎样动态显示

    简单的说就是每一秒更新一次屏幕,因此用Timer和TimerTask非常符合要求;每一秒刷新一次;

    三、代码

    package org.Demo00;
    
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.geom.Ellipse2D;
    import java.awt.geom.Line2D;
    import java.util.Calendar;
    import java.util.GregorianCalendar;
    import java.util.Timer;
    import java.util.TimerTask;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class Test5 extends JFrame {
    	MyPanel clockPanel;
    	Ellipse2D.Double e;
    	int x;
    	int y;
    	Line2D.Double hourLine;
    	Line2D.Double minLine;
    	Line2D.Double secondLine;
    	GregorianCalendar calendar;
    	int hour;
    	int minute;
    	int second;
    	public static final int X = 60;
    	public static final int Y = 60;
    	public static final int X_BEGIN = 10;
    	public static final int Y_BEGIN = 10;
    	public static final int RADIAN = 50;
    
    	public Test5() {
    		setSize(300, 400);
    		clockPanel = new MyPanel();
    		add(clockPanel);
    		Timer t = new Timer();
    		Task task = new Task();
    		t.schedule(task, 0, 1000);
    	}
    
    	public static void main(String[] args) {
    		Test5 t = new Test5();
    		t.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		t.setVisible(true);
    
    	}
    
    	class MyPanel extends JPanel {
    		public MyPanel() {
    			e = new Ellipse2D.Double(X_BEGIN, Y_BEGIN, 100, 100);
    			hourLine = new Line2D.Double(X, Y, X, Y);
    			minLine = new Line2D.Double(X, Y, X, Y);
    			secondLine = new Line2D.Double(X, Y, X, Y);
    		}
    
    		public void paintComponent(Graphics g) {
    			super.paintComponent(g);
    			Graphics2D g2 = (Graphics2D) g;
    			g2.drawString("12", 55, 25);
    			g2.drawString("6", 55, 105);
    			g2.drawString("9", 15, 65);
    			g2.drawString("3", 100, 65);
    			g2.draw(e);
    			g2.draw(hourLine);
    			g2.draw(minLine);
    			g2.draw(secondLine);
    		}
    	}
    
    	class Task extends TimerTask {
    		public void run() {
    			calendar = new GregorianCalendar();
    			hour = calendar.get(Calendar.HOUR);
    			minute = calendar.get(Calendar.MINUTE);
    			second = calendar.get(Calendar.SECOND);
    			hourLine.x2 = X + 40 * Math.cos(hour * (Math.PI / 6) - Math.PI / 2);
    			hourLine.y2 = Y + 40 * Math.sin(hour * (Math.PI / 6) - Math.PI / 2);
    			minLine.x2 = X + 45
    					* Math.cos(minute * (Math.PI / 30) - Math.PI / 2);
    			minLine.y2 = Y + 45
    					* Math.sin(minute * (Math.PI / 30) - Math.PI / 2);
    			secondLine.x2 = X + 50
    					* Math.cos(second * (Math.PI / 30) - Math.PI / 2);
    			secondLine.y2 = Y + 50
    					* Math.sin(second * (Math.PI / 30) - Math.PI / 2);
    			repaint();
    		}
    	}
    
    }
    


     

    作者:xiazdong
    出处:http://blog.xiazdong.info
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
  • 相关阅读:
    qml----动画入门(六、简单的动画实现 SpringAnimation类)
    qml----动画入门(五、简单的动画实现 SmoothedAnimation类)
    qml----动画入门(四、简单的动画实现 PathAnimation类)
    qml----动画入门(三、简单的动画实现 RotationAnimation类)
    SSRS连接ORACLE数据库制作报表
    JavaScript Number 对象
    Django--filter()-字段查找(双下划线的使用详解)
    Django--filter(**kwargs)
    Django--QuerySet--基础查询
    python 内置函数
  • 原文地址:https://www.cnblogs.com/xiazdong/p/3058132.html
Copyright © 2011-2022 走看看