# Analoge Uhr zeichnen



## 4u44r (6. Mai 2007)

Hallo,

ich möchte gerne mit Hilfe von Threading und Swing eine analoge Uhr zeichnen (Stunden, Minuten und Sekunden anzeige).

Bisher habe ich folgenden Code:


```
getContentPane().setLayout(new BorderLayout());

			anzeige.setHorizontalAlignment(JLabel.CENTER);
			anzeige.setFont(new Font("Times-Roman", Font.BOLD, 72));
			getContentPane().add(anzeige, BorderLayout.NORTH);

		
			setDefaultCloseOperation(EXIT_ON_CLOSE);
			setLocation(100, 100);
			setSize(400, 160);
			setTitle("Uhr");
			setVisible(true);
```

Nun möchte ich per

```
new Thread(clock).start();
```

einen neuen Thread starten, der die Anzeige erstellt und aktualisiert.
Leider habe ich keine Idee, wie ich die Striche zeichnen kann und diese nach belieben richtig verschieben kann.

HAt hier vll jemand ein Beispiel?
danke!


----------



## dieta (6. Mai 2007)

Die Positionen kannst du relativ einfach mit der Sinus-Funktion berechnen ( Math.sin(x) ).
Die Striche und das alles zeichnest du am Besten auf ein Panel über dessen paintComponent-Methode.
Dazu wirst du hier im Forum und in den FAQs auch einiges finden.


----------



## 4u44r (6. Mai 2007)

Hi,

nach ein wenig Suchen habe ich folgedes zusammengestellt:


```
import java.awt.*;
import javax.swing.Timer;
import java.awt.event.*;
import java.util.*;
import java.text.*;
import javax.swing.*;

class Yosclock extends JComponent implements Runnable {
	int r = 50;

	int cs, ch, ce, cm, cu;

	Calendar tNow;

	Timer timer;

	BasicStroke s1 = new BasicStroke(1);

	BasicStroke s2 = new BasicStroke(2);

	BasicStroke s3 = new BasicStroke(3);

	int Ss = 0;

	int Sm = 0;

	public Yosclock() {
		timer = new Timer(1000, new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				go();
			}
		});
		setSize(r * 2, r * 2 + 3);
		setForeground(Color.lightGray);
		setVisible(true);
	}

	public void run() {
		timer.start();
	}

	public void go() {
		repaint();
		Ss++;
		if (Ss == 60) {
			Ss = 0;
			Sm = (Sm + 1) % 60;
		}
	}

	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		Graphics2D g2 = (Graphics2D) g;
		g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
				RenderingHints.VALUE_ANTIALIAS_ON);
		g2.setColor(Color.black);
		tNow = Calendar.getInstance();
		ch = tNow.get(Calendar.HOUR);
		cu = tNow.get(Calendar.MINUTE);
		cs = tNow.get(Calendar.SECOND);
		cm = (cu * 6) + (cs / 10);
		ce = (ch * 30) + (cu / 2);
		g2.setStroke(s3);
		mahog(g2, ce, r / 3); // hou
		g2.setStroke(s2);
		mahog(g2, cm - 5, r / 7); // min
		g2.setStroke(s1);
		secs(g2, cs * 6, 4); // sec
		g2.dispose();
	}

	public void mahog(Graphics2D g2, int dg, double rs) {
		int x1 = xgetSin(dg + 180, r - r / 7);
		int y1 = ygetCos(dg + 180, r - r / 7);
		int x2 = xgetSin(dg, rs);
		int y2 = ygetCos(dg, rs);
		g2.drawLine(x1, y1, x2, y2);
	}

	public void secs(Graphics2D g2, int dg, double rs) {
		int x1 = xgetSin(dg + 180, r - r / 5);
		int y1 = ygetCos(dg + 180, r - r / 5);
		int x2 = xgetSin(dg, rs);
		int y2 = ygetCos(dg, rs);
		g2.drawLine(x1, y1, x2, y2);
	}

	public int xgetSin(double dg, double a) {
		double sin = Math.sin(dg / 57.3248) * (r - a) + 0.5;
		return (((int) sin) + r);
	}

	public int ygetCos(double dg, double a) {
		double cos = Math.cos(dg / 57.3248) * (r - a) + 0.5;
		return (r - ((int) cos));
	}

	public static void main(String[] args) {
	Yosclock yos = new Yosclock();
	Thread th = new Thread(yos);
	th.start(); 
	Yosclock.}
}
[quote]

wenn ich die Anwendung nun aber starte, passiert überhaupt nix, also es kommt nicht mal eine Fehlermeldung :(

Weiß jemand evtl warum?[/quote]
```


----------



## dieta (6. Mai 2007)

Yosclock ist eine JComponent, damit die sichtbar wird, brauchst du noch ein JFrame, dem du sie hinzufügst.


----------



## André Uhres (6. Mai 2007)

http://www.java-forum.org/de/viewtopic.php?p=144108#144108


----------

