import javax.swing.*;
import java.util.*;
import java.text.*;
import java.awt.*;
import java.awt.geom.AffineTransform;
/*
*title: 实现一个精美的时钟
* C#版本时钟http://blog.youkuaiyun.com/gdjlc/article/details/8651485
*author: pnjlc
*date: 2013-12-10
*blog: http://blog.youkuaiyun.com/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);
}
}
}
效果如下: