import java.awt.*; import java.awt.event.*; import static java.lang.Math.*; import java.time.LocalTime; import javax.swing.*; class Clock extends JPanel { final float degrees06 = (float) (PI / 30); final float degrees30 = degrees06 * 5; final float degrees90 = degrees30 * 3; final int size = 590; final int spacing = 40; final int diameter = size - 2 * spacing; final int cx = diameter / 2 + spacing; final int cy = diameter / 2 + spacing; public Clock() { setPreferredSize(new Dimension(size, size)); setBackground(Color.white); new Timer(1000, (ActionEvent e) -> { repaint(); }).start(); } @Override public void paintComponent(Graphics gg) { super.paintComponent(gg); Graphics2D g = (Graphics2D) gg; g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); drawFace(g); final LocalTime time = LocalTime.now(); int hour = time.getHour(); int minute = time.getMinute(); int second = time.getSecond(); float angle = degrees90 - (degrees06 * second); drawHand(g, angle, diameter / 2 - 30, Color.red); float minsecs = (minute + second / 60.0F); angle = degrees90 - (degrees06 * minsecs); drawHand(g, angle, diameter / 3 + 10, Color.black); float hourmins = (hour + minsecs / 60.0F); angle = degrees90 - (degrees30 * hourmins); drawHand(g, angle, diameter / 4 + 10, Color.black); } private void drawFace(Graphics2D g) { g.setStroke(new BasicStroke(2)); g.setColor(Color.white); g.fillOval(spacing, spacing, diameter, diameter); g.setColor(Color.black); g.drawOval(spacing, spacing, diameter, diameter); } private void drawHand(Graphics2D g, float angle, int radius, Color color) { int x = cx + (int) (radius * cos(angle)); int y = cy - (int) (radius * sin(angle)); g.setColor(color); g.drawLine(cx, cy, x, y); } public static void main(String[] args) { SwingUtilities.invokeLater(() -> { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setTitle("Clock"); f.setResizable(false); f.add(new Clock(), BorderLayout.CENTER); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); }); } }