首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 繪製類比時鐘:使用 Swing 與 2D 圖形

     編輯:Java 程式設計入門

本例實作一個類比時鐘,使用 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),需修正為正確方法名稱。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved