Java小应用程序指针时钟

来源:互联网 发布:西甲数据库 编辑:程序博客网 时间:2024/05/18 02:11
Java时钟
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author fyx
 */
import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
import java.util.*;
import static java.lang.Math.*;
public class Clockfyx extends JApplet{
    private ClockPaint panel;
    private Thread t;
    @Override
    public void init()
    {
        Calendar d=Calendar.getInstance(); //获得本地系统时间
        panel=new ClockPaint(d.get(Calendar.MONTH),d.get(Calendar.DATE),d.get(Calendar.DAY_OF_WEEK),d.get(Calendar.HOUR)*5+d.get(Calendar.MINUTE)/12,d.get(Calendar.MINUTE),d.get(Calendar.SECOND));
        panel.setBackground(Color.black);
        add(panel);
        Runnable r=new ClockRunnable(panel);
        t=new Thread(r);
        t.start();
    }
}

class ClockRunnable extends Thread//创建第二个线程
{
    private ClockPaint component;
    public ClockRunnable(ClockPaint aComponent)
    {
        component=aComponent;
    }
    @Override
    public void run()
    {
        try
        {
            Calendar d=Calendar.getInstance(); //获得本地系统时间
            component.reset(d.get(Calendar.HOUR)*5+d.get(Calendar.MINUTE)/12,d.get(Calendar.MINUTE),d.get(Calendar.SECOND));
            for(;;)
            {
                component.repaint();
                Toolkit.getDefaultToolkit().beep();
                Thread.sleep(1000);
            }
        }
        catch(InterruptedException e){}
    }
}

class ClockPaint extends JPanel
{
    private ArrayList<Line2D> Slines,Mlines,Hlines;//数组列表
    private double X,Y;
    private int r,x,y;
    private double SR,MR,HR;
    private int Mtag,Htag,Stag;
    private String Month1,Date1,Week1;
    public ClockPaint(int month,int date,int week,int hour,int minute,int second)
    {
        Stag=second;Mtag=minute;Htag=hour;
        if(month<9)
        {
            Month1="0"+(month+1);
        }
        else
        {
            Month1=""+(month+1);
        }
        if(date<10)
        {
            Date1="0"+date;
        }
        else
        {
            Date1=""+date;
        }
        switch(week)
        {
            case 1:
                   Week1="日";
                   break;
            case 2:
                   Week1="一";
                   break;
            case 3:
                   Week1="二";
                   break;
            case 4:
                   Week1="三";
                   break;
            case 5:
                   Week1="四";
                   break;
            case 6:
                   Week1="五";
                   break;
            case 7:
                   Week1="六";
                   break;
        }
        X=300;Y=300;x=300;y=300;
        HR=160;SR=220;MR=180;
        r=250;
        Slines=new ArrayList<Line2D>();
        Mlines=new ArrayList<Line2D>();
        Hlines=new ArrayList<Line2D>();
        for(int i=0;i<60;++i)
        {
            Slines.add(new Line2D.Double(300,300,X+sin(PI*i/30)*SR,Y-cos(PI*i/30)*SR));
            Mlines.add(new Line2D.Double(300,300,X+sin(PI*i/30)*MR,Y-cos(PI*i/30)*MR));
            Hlines.add(new Line2D.Double(300,300,X+sin(PI*i/30)*HR,Y-cos(PI*i/30)*HR));
        }
    }
    public void reset(int h,int m,int s)
    {
        Stag=s;Mtag=m;Htag=h;
    }
    @Override
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2=(Graphics2D)g;
        g2.setPaint(new GradientPaint(80,80,Color.red,520.0F,520.0F,Color.BLUE));//构造一个简单的非周期性 GradientPaint 对象。
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);//ALPHA_INTERPOLATION 提示是一个提供高级建议的常规提示,控制是否在多个线性可视效果计算过程中将颜色和 alpha 值转换到线性颜色空间。
        //VALUE_ANTIALIAS_ON 抗锯齿提示值使用抗锯齿模式完成呈现
        //优化图形
        g2.fillOval(20,20,280*2,280*2);
        g2.setPaint(Color.BLACK);
        g2.fillOval(75, 75, 225*2, 225*2);
        g2.setPaint(Color.CYAN);
        g2.fillOval(115, 115, 185*2, 185*2);
        g2.setPaint(Color.BLACK);
        g2.fillOval(290, 290, 20, 20);
        Font s14=new Font("宋体",Font.BOLD,20);
        g2.setFont(s14);
        g2.setPaint(Color.GREEN);
        for(int i=1;i<60;i++)
        {
            if(i%5==0)
            {
                g2.drawString(""+(i/5),x+(float)sin(PI*i/30)*r-5,y-(float)cos(PI*i/30)*r+5);
                continue;
            }
            Ellipse2D circle=new Ellipse2D.Double(x+(double)sin(PI*i/30)*r-4,y-(double)cos(PI*i/30)*r-4,8,8);
            g2.fill(circle);
        }
        g2.drawString("12",x-11,y-r+5);
        g2.setPaint(Color.BLACK);
        g2.fillRect(x-74,y-82,154,23);
        g2.setPaint(Color.WHITE);
        g2.drawString(Month1+"月"+Date1+"日星期"+Week1,x-73,y-63);
        g2.setStroke(new BasicStroke(5.0F,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND));//BasicStroke 类定义针对图形图元轮廓呈现属性的一个基本集合
        g2.setPaint(Color.YELLOW);
        if(Mtag<Mlines.size())
        {
            g2.draw(Mlines.get(Mtag));
        }
        else
        {
            g2.draw(Mlines.get(0));
        }
        if(Htag<Hlines.size())
        {
            g2.draw(Hlines.get(Htag));
        }
        else
        {
            g2.draw(Hlines.get(0));
        }
        if(Stag<Slines.size())
        {
            g2.draw(Slines.get(Stag++));
        }
        else
        {
            Stag=0;
            g2.draw(Slines.get(Stag++));
            if(Mtag<Mlines.size())
            {
                Mtag++;
            }
            else
            {
                Mtag=0;
                if(Htag>=Hlines.size())
                {
                    Htag=0;
                }
            }
            if(Mtag%12==0&&Htag<Hlines.size())g2.draw(Hlines.get(Htag++));   
        }
    }
}
原创粉丝点击