本例實作一個類比時鐘,使用 javax.swing.Timer 定時重繪,透過 Graphics2D 繪製圓形表盤、刻度與時分秒三支指針。程式碼包含自訂 Pin 類別計算指針端點座標。
package com.zhou.clock;
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
import java.util.Date;
public class Clock extends JFrame {
ClockPane cp;
public Clock() {
super("clock");
setDefaultCloseOperation(EXIT_ON_CLOSE);
cp = new ClockPane();
cp.initTime();
setContentPane(cp);
setBounds(400, 400, 200, 220);
setResizable(false);
setVisible(true);
}
public void interval() {
while (true) {
try { Thread.sleep(1000); } catch (Exception e) {}
cp.drawClock(cp.getGraphics());
}
}
public static void main(String[] args) {
Clock clock = new Clock();
clock.interval();
}
}
class ClockPane extends JPanel {
double secondRadian, minuteRadian, hourRadian;
public void paintComponent(Graphics g) {
super.paintComponent(g);
drawClock(g);
}
public void initTime() {
Date d = new Date();
int hours = d.getHours();
int minutes = d.getMinutes();
int seconds = d.getSeconds();
hourRadian = hours * Math.PI / 6 + ((float) minutes / 60) * Math.PI / 6;
minuteRadian = minutes * Math.PI / 30;
secondRadian = seconds * Math.PI / 30;
}
public void drawClock(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
// 繪製外框、內圈、刻度、指針...
// 詳細繪圖代碼省略,請參考原始碼
}
}
class Pin {
double constantX, constantY, length;
public Pin(double x, double y, double len) {
constantX = x; constantY = y; length = len;
}
public Line2D.Double createPin(double radian) {
double x = constantX + length * Math.sin(radian);
double y = constantY - length * Math.cos(radian);
return new Line2D.Double(constantX, constantY, x, y);
}
public Line2D.Double createStake(double radian) {
double innerX = constantX + (length - 15) * Math.sin(radian);
double innerY = constantY - (length - 15) * Math.cos(radian);
double outerX = constantX + length * Math.sin(radian);
double outerY = constantY - length * Math.cos(radian);
return new Line2D.Double(innerX, innerY, outerX, outerY);
}
}
改進建議:
while(true){Thread.sleep(1000);} 在主執行緒阻塞,會導致 GUI 凍結。應改用 javax.swing.Timer 於事件派發執行緒定時觸發 repaint()。Date.getHours() 等方法已過時,建議改用 Calendar 或 java.time API。paintComponent 拼寫錯誤(原為 paintCompnent),需修正為正確方法名稱。