java 编程 钟表 线程

import java.awt.BorderLayout;

import javax.swing.JFrame;


public class Clock extends JFrame{

       public Clock() {
              this.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
              this.set Size(Global.FRAMEWIDTH , Global.FRAMEHEIGHT);
              this.setTitle("My Clock");
              this.setLocationRelativeTo(null );
              this.add(new ClockPanel() , BorderLayout.CENTER);
       }
       public static void main(String[] args) {
              // TODO Auto-generated method stub
              new Clock().setVisible(true);
       }

}


import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.util.Calendar;
import java.util.GregorianCalendar;

import javax.swing.JPanel;

public class ClockPanel extends JPanel{
    private GregorianCalendar now ;
    private int hour , minute , second ;
    public ClockPanel() {
        now = new GregorianCalendar();
        hour = now.get(Calendar.HOUR);
        minute = now.get(Calendar.MINUTE);
        second = now.get(Calendar.SECOND);
        // 线程启动
        getNowTimeThread();
    }
   
    public void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D)g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);   
        g2.setStroke(new BasicStroke(2f));
        // 绘制表盘
        clockCircle(g2);
       
        // 绘制时针
        drawHour(g2);
        // 绘制分针
        drawMinute(g2);
        // 绘制秒针
        clockSecond(g2);
       
        // 绘制表盘的中心点
        g2.setColor(Color.RED);
        Ellipse2D circle = new Ellipse2D.Double(Global.CX-4, Global.CY-4, 8, 8);
        g2.fill(circle);
       
    }


 private void clockCircle(Graphics2D g) {
        super.paintComponent(g);
        // 表盘一圈360度,每间隔step画一个点
        for(int i = 0 ;i < 360; i+= Global.STEP) {
            double x , y;
            x = Global.CX + (Global.CLOCKR) * Math.cos(Math.toRadians(i - 90));
            y = Global.CY + (Global.CLOCKR) * Math.sin(Math.toRadians(i - 90));
            Ellipse2D circle ;
            if(i % (360/12) == 0) {
                g.setColor(Color.RED);
                circle = new Ellipse2D.Double(x-3, y-3, 6, 6);
            }
            else {               
                g.setColor(Color.BLUE);
                circle = new Ellipse2D.Double(x-2, y-2, 4, 4);
            }
            g.fill(circle);
        }
    }

// 绘制秒针
    private void clockSecond(Graphics2D g) {
        // 起点坐标
        double x0 , y0;
        x0 = Global.CX + 15 * Math.cos(Math.toRadians(Global.STEP * second + 90));
        y0 = Global.CY + 15 * Math.sin(Math.toRadians(Global.STEP * second + 90));
       
        // 终点坐标
        double x , y;
        x = Global.CX + Global.SECONDR * Math.cos(Math.toRadians(Global.STEP * second - 90));
        y = Global.CY + Global.SECONDR * Math.sin(Math.toRadians(Global.STEP * second - 90));
        Line2D line = new Line2D.Double(x0, y0, x, y);
        g.setStroke(new BasicStroke(3f));
        g.setColor(Color.BLUE);
        g.draw(line);
    }


//绘制分针
    public void drawMinute(Graphics2D g) {
       
        int x1 = (int) (Global.CX + Global.MINUTER*Math.cos(Math.toRadians(minute*6-90)));
        int x2 = (int) (Global.CX + 5*Math.cos(Math.toRadians(minute*6)));       
        int x3 = (int) (Global.CX + 10*Math.cos(Math.toRadians(minute*6-270)));;       
        int x4 = (int) (Global.CX + 5*Math.cos(Math.toRadians(minute*6-180)));
       
        int y1 = (int) (Global.CY + Global.MINUTER*Math.sin(Math.toRadians(minute*6-90)));
        int y2 = (int) (Global.CY + 7*Math.sin(Math.toRadians(minute*6)));
        int y3 = (int) (Global.CY + 10*Math.sin(Math.toRadians(minute*6-270)));
        int y4 = (int) (Global.CY + 7*Math.sin(Math.toRadians(minute*6-180)));
        int[] xPoints = {x1 , x2 , x3 , x4};
        int[] yPoints = {y1 , y2 , y3 , y4};
        g.setColor(Color.LIGHT_GRAY);
        g.fillPolygon(xPoints, yPoints, 4);       
        g.setColor(Color.BLACK);
        g.drawPolygon(xPoints, yPoints, 4);       
    }


// 绘制时针
    public void drawHour(Graphics2D g) {
        int x1 =  (int) (Global.CX + Global.HINUTER*Math.cos(Math.toRadians(hour*30-90 + minute * 6/12)));
        int x2 =  (int) (Global.CX + 5*Math.cos(Math.toRadians(hour*30 + minute * 6/12)));
       
        int x3 = (int) (Global.CX + 10*Math.cos(Math.toRadians(hour*30-270 + minute * 6/12)));;      
        int x4 =  (int) (Global.CX + 5*Math.cos(Math.toRadians(hour*30-180 + minute * 6/12)));
       
        int y1 = (int) (Global.CY + Global.HINUTER*Math.sin(Math.toRadians(hour*30-90 + minute * 6/12)));
        int y2 = (int) (Global.CY + 7*Math.sin(Math.toRadians(hour*30 + minute * 6/12)));
        int y3 = (int) (Global.CY + 10*Math.sin(Math.toRadians(hour*30-270 + minute * 6/12)));
        int y4 = (int) (Global.CY + 7*Math.sin(Math.toRadians(hour*30-180 + minute * 6/12)));
        int[] xPoints = {x1 , x2 , x3 , x4};
        int[] yPoints = {y1 , y2 , y3 , y4};
        g.setColor(Color.LIGHT_GRAY);
        g.fillPolygon(xPoints, yPoints, 4);
        g.setColor(Color.BLACK);
        g.drawPolygon(xPoints, yPoints, 4);       
    }
   
    // 时钟时分秒变化的线程
    public void getNowTimeThread() {
        new Thread() {
            public void run() {
                while(true) {
                    second++;
                    if(second > 59) {
                        minute += 1;
                        second = 0;
                    }
                    if(minute > 59) {
                        hour += 1;
                        minute = 0;
                    }
                    if(hour > 24) {
                        hour = 0;
                    }
                    repaint();
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }                   
                }
            }
        }.start();
    }
}


public class Global {
    // 设置一下影响窗体大小和时钟大小相关参数
    public static final int MARGINTOP = 30;
    public static final int MARGINLEFT = 30;
    public static final int CLOCKR = 150;
    public static final int SECONDR = CLOCKR - 10;
    public static final int MINUTER = CLOCKR - 10 - 15;
    public static final int HINUTER = CLOCKR - 10 - 15 * 2;
   
   
    public static final int STEP = 360 / 60;
    public static final int CX = MARGINLEFT + CLOCKR;
    public static final int CY = MARGINTOP  + CLOCKR;
   
    public static final int FRAMEWIDTH = CX * 2 + 8;
    public static final int FRAMEHEIGHT = CY * 2 + 30;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值