Как сделать часы (интерфейс циферблата)?

package com.company;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.AffineTransform;
import java.awt.geom.Line2D;

class Draw extends JPanel {
    private JLabel timeTXT;
    private int height;
    private int width;
    private int r = 250;
    private boolean pause = false;
    private int time = 0;
    private int h = 0;
    private int m = 0;
    private int s = 0;
    private int speed = 1000;
    private int angleInDegreesH = 0;
    private int angleInDegreesM = 0;
    private int angleInDegreesS = 0;
    private int offset = 360 / 60;
    private Timer t;

    Draw() {
        t = new Timer(speed, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                if (pause) {
                    m = time / 60;
                    s = time % 60;
                    time += 1;
                    if(time % 3600 == 0) {
                        time = 0;
                        h++;
                    }
                    if(m == 59 && h == 12)
                        h = 0;
                    angleInDegreesH = h * (offset * 5);
                    angleInDegreesM = m * offset;
                    angleInDegreesS = s * offset;
                    String timer = String.format("%02d:%02d:%02d", h, m, s);
                    timeTXT.setText(timer);
                    repaint();
                }
            }
        });
        t.start();
    }

    public void setSpeed(int speed) {
        this.speed = speed;
        t.setDelay(speed);
    }

    public void setSize(int width, int height) {
        this.width = width;
        this.height = height;
    }

    public void setTimeTXT(JLabel timeTXT) {
        this.timeTXT = timeTXT;
    }

    public void setSwitchActive() {

        pause = !pause;
    }

    private void drawGraphic(Graphics2D g) {
        g.setColor(Color.blue);
        Line2D lH = new Line2D.Double(width / 2, height / 2 - 70, width / 2, height / 2 - r - 30);
        AffineTransform atH =
                AffineTransform.getRotateInstance(
                        Math.toRadians(angleInDegreesH), lH.getX1(), lH.getY1());
        g.draw(atH.createTransformedShape(lH));


        g.setColor(Color.green);
        Line2D lM = new Line2D.Double(width / 2, height / 2 - 70, width / 2, height / 2 - r - 50);
        AffineTransform atM =
                AffineTransform.getRotateInstance(
                        Math.toRadians(angleInDegreesM), lM.getX1(), lM.getY1());
        g.draw(atM.createTransformedShape(lM));


        g.setColor(Color.red);
        Line2D ls = new Line2D.Double(width / 2, height / 2 - 70, width / 2, height / 2 - r - 70);
        AffineTransform atS =
                AffineTransform.getRotateInstance(
                        Math.toRadians(angleInDegreesS), ls.getX1(), ls.getY1());
        g.draw(atS.createTransformedShape(ls));
    }

    @Override
    public void paintComponent(Graphics g) {
        g.setColor(Color.DARK_GRAY);
        g.fillRect(0, 0, 4000, 4000);
        drawGraphic((Graphics2D) g);
    }
}

public class Main extends JFrame {

    private JPanel mainPanel = new JPanel(new BorderLayout());
    private JPanel activePanel = new JPanel();
    private Draw draw;

    private JButton switchBTN = new JButton("START");
    private JLabel time = new JLabel("00:00:00");
    private JTextField field = new JTextField(10);

    Main() {

        draw = new Draw();

        draw.setTimeTXT(time);

        activePanel.setLayout(new FlowLayout());
        activePanel.add(time);
        activePanel.add(field);
        activePanel.add(switchBTN);

        mainPanel.add(draw, BorderLayout.CENTER);
        mainPanel.add(activePanel, BorderLayout.SOUTH);

        add(mainPanel);
        setTitle("Clock");
        setSize(720, 720);
        draw.setSize(getWidth(), getHeight());
        setLocation(200, 10);
        setDefaultCloseOperation(3);
        setResizable(false);
        setVisible(true);

        switchBTN.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                draw.setSwitchActive();
                if (switchBTN.getText().equals("START")) {
                    switchBTN.setText("STOP");
                    if(!field.getText().equals(""))
                        draw.setSpeed(Integer.parseInt(field.getText()));
                    else
                        draw.setSpeed(1000);
                }
                else
                    switchBTN.setText("START");
            }
        });
    }

    public static void main(String[] args) {
        new Main();
    }
}

Вот у меня есть часы, нужно только добавить цифры по колу. Сделать циферблатвведите сюда описание изображения


Ответы (1 шт):

Автор решения: Alexander Chernin

Лучше нарисовать и подгружать картинкой. Краткий пример как это сделать ( док про drawImage):

class Draw extends JPanel {
    private BufferedImage clockBack = null;

    // Метод загрузки картинки с циферблатом
    public void setClockBackgroundImageFile(String path2imagefile) {
        clockBack = ImageIO.read(new File(path2imagefile));
        repaint();
    }

    @Override
    public void paintComponent(Graphics g) {
        g.setColor(Color.DARK_GRAY);
        g.fillRect(0, 0, 4000, 4000);
        // Если картинка с циферблатом загружена, то отрисовываем
        if( clockBack != null ) {
            g.drawImage(clockBack);
        }
        drawGraphic((Graphics2D) g);
    }
    ...
}

И далее передаем путь:

draw = new Draw();
draw.setClockBackgroundImageFile("<Путь/к/картинке/с/циферблатом>.jpg");
→ Ссылка