?? 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 + -