import java.awt.*;
import java.awt.event.*;
import java.awt.event.ActionListener;
import java.awt.geom.GeneralPath;
import java.util.Calendar;

import javax.swing.*;

/**
 * @author Remi Forax
 *
 */
public class ClockExample extends JComponent {

  protected void paintComponent(Graphics graphics) {
    super.paintComponent(graphics);

    Graphics2D g= (Graphics2D)graphics;

    g.clearRect(0, 0, getWidth(), getHeight());

    g.setRenderingHint(
      RenderingHints.KEY_ANTIALIASING,
      RenderingHints.VALUE_ANTIALIAS_ON);

    int width= Math.min(getWidth()-15, getHeight()-15);

    g.translate(getWidth() / 2, getHeight() / 2);
    g.setColor(Color.green);
    g.fillOval(-width / 2, -width / 2, width, width);
    g.setColor(Color.BLACK);
    g.setStroke(
      new BasicStroke(14, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));
    g.drawOval(-width / 2, -width / 2, width, width);

    calendar.setTimeInMillis(System.currentTimeMillis());
    int hour= calendar.get(Calendar.HOUR);
    int minute= calendar.get(Calendar.MINUTE);

    double angleHour= 2 * Math.PI * (hour - 3) / 12;
    double angleMinute= 2 * Math.PI * (minute - 15) / 60;

    GeneralPath path= new GeneralPath();
    path.moveTo(
      (int) (0.3 * width * Math.cos(angleHour)),
      (int) (0.3 * width * Math.sin(angleHour)));
    path.lineTo(0, 0);
    path.lineTo(
      (int) (0.4 * width * Math.cos(angleMinute)),
      (int) (0.4 * width * Math.sin(angleMinute)));
    g.draw(path);

  }

  public Dimension getPreferredSize() {
    return new Dimension(300, 300);
  }

  private final Calendar calendar= Calendar.getInstance();

  public static void main(String[] args) {

    Toolkit.getDefaultToolkit().setDynamicLayout(true);

    JFrame frame= new JFrame("ClockExample");
    final ClockExample component= new ClockExample();
    
    new Timer(999,new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        component.paintImmediately(0, 0, component.getWidth(),component.getHeight());
      }
    }).start();

    frame.setContentPane(component);
    frame.pack();
    frame.show();
  }
}
