📄 clock.java
字号:
/**
* @author xushun
* @author 2007/9/19
* 一个钟表
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.geom.*;
import java.util.GregorianCalendar;
import java.util.Calendar;
public class Clock {
public static void main(String[] args)
{
ClockFrame frame = new ClockFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
class ClockFrame extends JFrame
{
public ClockFrame()
{
setTitle("Clock");
setSize(250,250);
ClockJPanel panel = new ClockJPanel();
add(panel);
}
}
class ClockJPanel extends JPanel
{
public ClockJPanel()
{
//setPreferredSize(new Dimension(2*RADIUS + 1,2*RADIUS + 1));
calendar = new GregorianCalendar(); //获得现在时间
hours = calendar.get(Calendar.HOUR); //现在小时数
minutes =calendar.get(Calendar.MINUTE); //现在多少分
seconds = calendar.get(Calendar.SECOND); //现在多少秒
//center = new Point2D.Double(RADIUS,RADIUS);
//一个定时器,每隔一秒自动绘图
//用来实现钟表的自动旋转
t = new Timer(1000,new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
repaint();
}
});
t.start();
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 =(Graphics2D)g;
drawClock(g2); //绘画钟表
drawClockCircle(g2); //绘画钟表圈
increaseTime(); //每隔一秒时间递增
}
//绘画钟表
public void drawClock(Graphics2D g2)
{
double hourRadian = Math.toRadians((hours + minutes/60)*360/12); //时针所转过的弧度数
double minuteRadian = Math.toRadians(minutes*360/60); //分针所转过的弧度数
double secondRadian = Math.toRadians(seconds*360/60); //秒针所转过的弧度数
g2.setColor(Color.RED); //用红色绘画时针
drawHand(g2,hourRadian,HOUR_LENGTH);
g2.setColor(Color.BLUE); //用蓝色绘画分针
drawHand(g2,minuteRadian,MINUTE_LENGTH);
g2.setColor(Color.GREEN); //用绿色绘画秒针
drawHand(g2,secondRadian,SECOND_LENGTH);
}
//绘画钟表圈(60个点)
//每隔四点小点绘画一个大点
//每个大点分别表示(1,2,3……12)
public void drawClockCircle(Graphics2D g2)
{
for(int i = 0;i < 60;i++)
{
double ridian = Math.toRadians(6*i);
double x = RADIUS*(1 + Math.sin(ridian));
double y = RADIUS*(1 - Math.cos(ridian));
double m = MIN;
if(i%5 == 0)
{
m = MAX;
g2.setColor(Color.GREEN);
}
else
{
g2.setColor(Color.BLUE);
}
Ellipse2D circle = new Ellipse2D.Double(x-m,y-m,2*m,2*m);
g2.fill(circle);
}
}
//时间自动增加
public void increaseTime()
{
seconds++;
if(seconds == 60)
{
minutes++;
seconds=0;
}
if(minutes == 60)
{
hours++;
minutes=0;
}
}
/**
*
* @param g2
* @param ridian 钟表所转过的弧度
* @param handLength 长度
*/
private void drawHand(Graphics2D g2,double ridian,double handLength)
{
Point2D end = new Point2D.Double(RADIUS+handLength*Math.sin(ridian),
RADIUS-handLength*Math.cos(ridian));
Point2D start = new Point2D.Double(RADIUS-ADD_LENGTH*Math.sin(ridian),
RADIUS+ADD_LENGTH*Math.cos(ridian));
g2.draw(new Line2D.Double(start,end)); //画直线
}
private Timer t; //定时器
private GregorianCalendar calendar ; //日历
private int hours;
private int minutes;
private int seconds;
//private static Point2D center;
private static final int RADIUS = 100; //钟表半径
private static final double HOUR_LENGTH = 0.6*RADIUS; //时针长度
private static final double MINUTE_LENGTH = 0.7*RADIUS; //分针长度
private static final double SECOND_LENGTH = 0.8*RADIUS; //秒针长度
private static final double ADD_LENGTH = 10;
private static final double MAX = 3; //绘画大点半径
private static final double MIN = 1; //绘画小点半径
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -