java swing应用(4):实现一个精美的时钟

import javax.swing.*;
import java.util.*;  
import java.text.*;  
import java.awt.*;
import java.awt.geom.AffineTransform;

/*
*title: 实现一个精美的时钟
*       C#版本时钟http://blog.csdn.net/gdjlc/article/details/8651485
*author: pnjlc
*date: 2013-12-10
*blog: http://blog.csdn.net/pnjlc
*/
public class GuiDemo5{

  public static void main(String[] args){
      GuiDemo5 gui = new GuiDemo5();
      gui.go();
  }
  public void go(){     
      JFrame frame = new JFrame();     
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);      
      MyDrawPanel drawPanel = new MyDrawPanel();    
      frame.getContentPane().add(drawPanel);     
      frame.setSize(300,300);
      frame.setVisible(true);   
    
      while(true){
         drawPanel.repaint();
           try{
               Thread.sleep(1000);
           }catch(Exception ex){}
      } 
  }

  class MyDrawPanel extends JPanel{
     public void paintComponent(Graphics g){   
        Graphics2D g2d = (Graphics2D)g;
        //去锯齿
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        //清空原来的图形
        g2d.setColor(Color.WHITE);
        g2d.fillRect(0, 0, this.getWidth(), this.getHeight());
        g2d.setColor(Color.BLACK);
        
        //圆中心坐标
        int xCenter = this.getWidth() / 2;  
        int yCenter = this.getHeight() / 2;  
        // 计算半径  
        int radius = (int) (Math.min(this.getWidth(), this.getHeight()) * 0.8 * 0.5);  
        // 画圆  
        g2d.drawOval(xCenter - radius, yCenter - radius, radius * 2, radius * 2); 
  

        //画时钟的12个数字(如果用rotate方法则数字会倾斜倒立)
        for (int i = 0; i < 12; i++)  
        {  
           //已知圆中心占坐标(x0,y0),半径r,角度a0,则圆上任一点坐标(x,y)计算:  
           //x = x0 + r * cos(ao * 3.14 /180)   
           //y = y0 + r * sin(ao * 3.14 /180)   
                
            double dd = Math.PI / 180 * i * (360 /12); //每次转360/12度  
            int x = (xCenter-4) + (int)((radius - 12) * Math.cos(dd));  
            int y = (yCenter+4) + (int)((radius - 12) * Math.sin(dd));  
  
            //因为是从顺时钟3点钟开始画,所以索引i需要加上3  
            int j = i + 3;  
            if (j > 12)  
                 j = j - 12;  
            g2d.drawString(Integer.toString(j), x, y);                
       }  

       AffineTransform old = g2d.getTransform(); 

       //时钟的60个刻度
       for (int i = 0; i < 60; i++)  
       {  
           int w = i % 5 == 0 ? 5 : 3;  
           g2d.fillRect(xCenter-2, 28, w, 3); 
           g2d.rotate(Math.toRadians(6), xCenter, yCenter);  
       }  
       //设置旋转重置
       g2d.setTransform(old);
       
       Calendar calendar = Calendar.getInstance(); 
       int hour = calendar.get(Calendar.HOUR_OF_DAY);
       int minute = calendar.get(Calendar.MINUTE);
       int second = calendar.get(Calendar.SECOND);

       //画日期和星期
       DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd");
       DateFormat df2 = new SimpleDateFormat("E"); 
       g2d.drawRoundRect(xCenter-30, yCenter+10, 72, 35, 10, 10);
       g2d.drawString(df1.format(calendar.getTime()), xCenter-25, yCenter+25);  
       g2d.drawString(df2.format(calendar.getTime()), xCenter-12, yCenter+40);      

       // 画时钟的图形  
       double hAngle = (hour - 12 + minute / 60d) * 360d / 12d;    
       g2d.rotate(Math.toRadians(hAngle), xCenter, yCenter);    
       int xhArr[] = { xCenter, xCenter+9, xCenter, xCenter-9 };
       int yhArr[] = { 65, yCenter, yCenter+10, yCenter}; 
       g2d.drawPolygon(xhArr, yhArr, xhArr.length);
       g2d.setTransform(old);

       // 画分钟的图形 
       double mAngle = (minute + second / 60d) * 360d / 60d;
       g2d.rotate(Math.toRadians(mAngle), xCenter, yCenter); 
       int xmArr[] = { xCenter, xCenter+6, xCenter, xCenter-6 };
       int ymArr[] = { 45, yCenter, yCenter+12, yCenter};     
       g2d.drawPolygon(xmArr, ymArr, xmArr.length);
       g2d.setTransform(old);

       // 画秒钟的图形 
       double sAngle = second * 360d / 60d;
       g2d.rotate(Math.toRadians(sAngle), xCenter, yCenter); 
       g.drawLine(xCenter, yCenter+10, xCenter, 35);       
     }
  }
}

效果如下:


  • 5
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值