Как сделать часы (интерфейс циферблата)?
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");