import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.Calendar;
public class MyClock extends JPanel
{
static int ind, sec, min, hour;
@Override
protected void paintComponent( Graphics g )
{
g.setColor(new Color(255,255,255));
PolygonWithEgdes.drawNeck( g, getWidth() / 2, getHeight() / 2, 300, 60, false, sec);
}
public static void main( String[] args )
{
JFrame f = new JFrame();
f.setBackground(new Color(9,112,162));
f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
f.setSize( 140, 120 );
f.setResizable(true);
sec = 0;
for(ind=sec; ind>=0; ind++)
{
f.add( new MyClock() );
// hier wird eine halbe Sekunden gewartet damit man auch sicher jede sekunde bekommt!!
try
{
Thread.sleep(500); // 60000 sind eine Minute
}
catch(Exception exc)
{
System.out.println("exc");
}
if(sec > 45)
sec = Calendar.getInstance().get( Calendar.SECOND ) -45 ;
if(sec <= 45 || sec > 15)
sec = Calendar.getInstance().get( Calendar.SECOND ) -15;
if(sec < 0)
sec = Calendar.getInstance().get( Calendar.SECOND ) +45;
// hier wird nach einer Umrundung der Index wieder auf 0 gestellt
if(ind==60)
ind = 0;
f.setVisible( true );
}
}
}
class PolygonWithEgdes
{
static int min, min_anz, hour, hour_anz;
//private static Polygon p = new Polygon();
public static synchronized void drawNeck( Graphics g, int x, int y, int r, int n, boolean filled, int sec)
{
// p.reset();
// Jetzt caste ich das Graphics objekt in ein 2D Objekt. Grund-> Strichbreite, Kantenglättung usw. möglich
Graphics2D g2D = (Graphics2D) g;
g2D.clearRect(0,0,140,120);
g2D.setRenderingHint( RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
for ( int i = 0; i <= n; i++ )
{
// zeichnet punktweise den Kreis --> erst mal drin lassen
// p.addPoint( (int) (x + r * Math.cos( i * 2 * Math.PI / n )),
// (int) (y + r * Math.sin( i * 2 * Math.PI / n )) );
// zeichnet die Linie bei jedem Punkt und verbindet diesen mit dem Mittelpunkt
if(i%1 == 0 && filled != true && i == sec)
{
// Stil für Zeiger festlegen
BasicStroke stil_sec = new BasicStroke(1.0f,
BasicStroke.CAP_BUTT,
BasicStroke.JOIN_ROUND);
BasicStroke stil_min = new BasicStroke(2.0f,
BasicStroke.CAP_BUTT,
BasicStroke.JOIN_ROUND);
BasicStroke stil_hour = new BasicStroke(3.0f,
BasicStroke.CAP_BUTT,
BasicStroke.JOIN_ROUND);
// Sekunde holen und zeichnen
g2D.setStroke(stil_sec);
g2D.drawLine( x,
y,
(int) (x + 30 * Math.cos( i * 2 * Math.PI / n )),
(int) (y + 30 * Math.sin( i * 2 * Math.PI / n )));
// Minute holen und zeichnen
g2D.setStroke(stil_min);
min = Calendar.getInstance().get( Calendar.MINUTE );
if(min > 45)
min_anz = min-45 ;
if(min <= 45 || min > 15)
min_anz = min-15;
if(min < 0)
min_anz = min+45;
g2D.drawLine( x,
y,
(int) (x + 30 * Math.cos( min_anz * 2 * Math.PI / n )),
(int) (y + 30 * Math.sin( min_anz * 2 * Math.PI / n )));
// Stunde holen und zeichnen
g2D.setStroke(stil_hour);
hour = Calendar.getInstance().get( Calendar.HOUR );
if(hour >= 3 && hour <=12)
hour_anz = hour*5-15;
if(hour < 3)
hour_anz = hour*5+45;
g2D.drawLine( x,
y,
(int) (x + 25 * Math.cos(hour_anz * 2 * Math.PI / n )),
(int) (y + 25 * Math.sin(hour_anz * 2 * Math.PI / n )));
}
}
//if ( filled )
// g2D.fillPolygon( p );
//else
// g2D.drawPolygon( p );
}
}