おすすめアイテムをいくつか紹介

広告ブロックがONになっていると表示されないことがあります。

【Java】アナログ時計を表示するサンプルプログラムを紹介

お疲れ様です。はるさらと申します。

今回は、Javaを使ってシンプルな
アナログ時計
を作成する方法を紹介します。

◆完成イメージ

JavaのSwingライブラリを使用して
比較的簡単に作成することができます。

アナログ時計を描画するための
基本的なコードとその解説を記載していきますので
何かの参考になりましたら幸いです。

アナログ時計を表示するプログラムサンプル

実際のコードを先に紹介します。
AnalogClock.javaを作成し
その中に下記コードを張り付けていただければ
実行することが可能です。

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.time.LocalTime;
import java.util.Timer;
import java.util.TimerTask;

public class AnalogClock extends JPanel implements ActionListener {
    private Timer timer;

    public AnalogClock() {
        timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                repaint();
            }
        }, 0, 1000);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        LocalTime now = LocalTime.now();
        int width = getWidth();
        int height = getHeight();
        int radius = Math.min(width, height) / 2 - 10;
        int centerX = width / 2;
        int centerY = height / 2;

        g.setColor(Color.WHITE);
        g.fillRect(0, 0, width, height);
        g.setColor(Color.BLACK);
        g.drawOval(centerX - radius, centerY - radius, radius * 2, radius * 2);

        double secondAngle = Math.toRadians((now.getSecond() - 15) * 6);
        double minuteAngle = Math.toRadians((now.getMinute() - 15) * 6);
        double hourAngle = Math.toRadians((now.getHour() % 12 - 3) * 30 + now.getMinute() / 2.0);

        drawHand(g, centerX, centerY, radius - 10, secondAngle, Color.RED, 2);
        drawHand(g, centerX, centerY, radius - 20, minuteAngle, Color.BLUE, 4);
        drawHand(g, centerX, centerY, radius - 30, hourAngle, Color.BLACK, 6);

        g.setColor(Color.BLACK);
        for (int i = 0; i < 12; i++) {
            double angle = Math.toRadians(i * 30 - 60);
            int x = (int) (centerX + Math.cos(angle) * (radius - 20));
            int y = (int) (centerY + Math.sin(angle) * (radius - 20));
            g.drawString(Integer.toString(i + 1), x - 5, y + 5);
        }
    }

    private void drawHand(Graphics g, int centerX, int centerY, int length, double angle, Color color, int width) {
        g.setColor(color);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setStroke(new BasicStroke(width));
        int x = (int) (centerX + Math.cos(angle) * length);
        int y = (int) (centerY + Math.sin(angle) * length);
        g2d.drawLine(centerX, centerY, x, y);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        repaint();
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("Analog Clock");
        AnalogClock clock = new AnalogClock();
        frame.add(clock);
        frame.setSize(400, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

※chatGPTにて作成

コードの解説

一部コードの解説を
記載させていただきます。

インポートとクラス定義

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.time.LocalTime;
import java.util.Timer;
import java.util.TimerTask;

public class AnalogClock extends JPanel implements ActionListener {
    private Timer timer;

javax.swing.*java.awt.* パッケージをインポートします。
これにより、Swingコンポーネントや
グラフィックス描画機能を使用できるようになります。

AnalogClock クラスは JPanel を拡張し、
ActionListener を実装します。
これにより、パネル上での描画とタイマーイベントを処理できます。

タイマーの設定

public AnalogClock() {
    timer = new Timer();
    timer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            repaint();
        }
    }, 0, 1000);
}

コンストラクタでは、Timer を作成し、
1秒ごとに repaint() メソッドを
呼び出すようにスケジュールします。
これにより、時計が1秒ごとに更新されます。

描画処理

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    LocalTime now = LocalTime.now();
    int width = getWidth();
    int height = getHeight();
    int radius = Math.min(width, height) / 2 - 10;
    int centerX = width / 2;
    int centerY = height / 2;

paintComponent メソッド内で、
現在の時間を取得し、
描画のための基本的な計算を行います。

時計の中心座標と半径を計算し、
背景や外枠を描画します。

    double secondAngle = Math.toRadians((now.getSecond() - 15) * 6);
    double minuteAngle = Math.toRadians((now.getMinute() - 15) * 6);
    double hourAngle = Math.toRadians((now.getHour() % 12 - 3) * 30 + now.getMinute() / 2.0);

    drawHand(g, centerX, centerY, radius - 10, secondAngle, Color.RED, 2);
    drawHand(g, centerX, centerY, radius - 20, minuteAngle, Color.BLUE, 4);
    drawHand(g, centerX, centerY, radius - 30, hourAngle, Color.BLACK, 6);

時間の角度を計算し、
それぞれの時計の針(秒針、分針、時針)を描画します。

針の描画

private void drawHand(Graphics g, int centerX, int centerY, int length, double angle, Color color, int width) {
    g.setColor(color);
    Graphics2D g2d = (Graphics2D) g;
    g2d.setStroke(new BasicStroke(width));
    int x = (int) (centerX + Math.cos(angle) * length);
    int y = (int) (centerY + Math.sin(angle) * length);
    g2d.drawLine(centerX, centerY, x, y);
}

drawHand メソッドで、針の長さ、
角度、色、太さを指定して針を描画します。

メインメソッド

@Override
public void actionPerformed(ActionEvent e) {
    repaint();
}

public static void main(String[] args) {
    JFrame frame = new JFrame("Analog Clock");
    AnalogClock clock = new AnalogClock();
    frame.add(clock);
    frame.setSize(400, 400);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
}

actionPerformed メソッドでは、
repaint() を呼び出してパネルを更新します。
main メソッドでは、JFrame を作成し、
AnalogClock パネルを追加して表示します。

Javaを使用してアナログ時計を表示するまとめ

このプログラムでは、
JavaのSwingライブラリを使用してアナログ時計を描画しました。

Timer を使って定期的に画面を更新し、
Graphics クラスを使って時計の針や数字を描画しています。

GUIの基本的な使い方と、
アナログ時計を描く方法について参考になれば幸いです。

ご自由にカスタマイズいただき
課題提出などに役立ててください。
それではまたー!