• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Drei sehr unterschiedliche Fotos warten bei unserem Februar-Thema - Quadrat zum Quadrat - darauf, von Euch bewertet zu werden. Los, auf geht’s! Hier geht es lang zur Abstimmung --> Klick

Java: Fenster mit zwei Uhren + zwei Stoppuhren

ando-x88

Celler Dickstiel
Registriert
29.03.07
Beiträge
799
Ich muss für die Uni ein Programm schreiben, welches ein Fenster öffnet, in dem eine analoge und eine digitale Uhr zu sehen sind. Zudem sollen dort zwei Buttons sein, mit denen man die Stoppuhren A und B starten und stoppen kann.
Bisher habe ich die zwei Uhren fertig, die Stoppuhren lassen sich per Konsole starten.

Mein Problem sind die Buttons: Ich schaffe es einfach nicht, sie zu erstellen. Könnt ihr mir helfen?


Hier nochmal die Aufgabenstellung:

Schreiben Sie ein Programm, das zwei Uhren und zwei Stoppuhren anzeigt. Die eine Uhr ist eine Analoguhr mit einem Stunden-, einem Minuten- und einem Sekundenzeiger. Zeichnen Sie diese Uhr einfach als einen Kreis mit jeweils einem Strich für die Zeiger. Die andere Uhr ist eine Digitaluhr, die die Stunden, Minuten und Sekunden in Ziffern anzeigt. Darüber hinaus sollen zwei Stoppuhren wie in Aufgabe 69 (Zwei Stoppuhren, die mit A und B über die Konsole gestartet und gestoppt werden) realisiert werden. Start und Stop einer Stoppuhr soll durch Anklicken eines Buttons erfolgen. Erzeugen Sie für jede Uhr einen Thread.

Code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Scanner;

import javax.swing.JButton;
import javax.swing.JDialog;
 
public class UhrAnwendung extends JDialog implements Runnable {
 

	private int c_x, c_y;
 
	private int radh, radms;
 
	public UhrAnwendung() {
		this.setAlwaysOnTop(true);
		this.setLocationByPlatform(true);
		this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
		//this.setSize(230, 230);
		this.setSize(400, 400);
 
		addWindowListener(new WindowAdapter() {
			public void windowClosed(WindowEvent e) {
				System.exit(0);
			}
		});
 
		c_x = 120;
		c_y = 120;
		radh = 50;
		radms = 75;
 
		this.setVisible(true);
 
		new Thread(this).start();
	}
 
	public static void main(String[] args) {
		UhrAnwendung ca = new UhrAnwendung();  //Öffnet ein Fenster und startet die analoge Uhr
		
		
		Stoppuhr a = new Stoppuhr();  //Stoppuhr A
		Stoppuhr b = new Stoppuhr();  //Stoppuhr B
		Scanner scanner = new Scanner(System.in);  //Eingabescanner
		
		//Wenn eine Stoppuhr gestoppt wird, wird die Variable auf true gesetzt
		boolean aGestoppt = false;  
		boolean bGestoppt = false;
		
		//Wenn beide Variablen false sind, wird das Programm beendet
		boolean aBereit = true;
		boolean bBereit = true;
		
		String eingabe = ("");
		
		//Programm akzeptiert nur 1x Start und Stopp pro Uhr
		while (aBereit == true | bBereit == true) {
		
			
			//Wenn die Eingabe "A" ist
			if (eingabe.equals("A")) {
				
				eingabe = ("");
			
				//Wenn a bereits läuft
				if (a.isAlive()) {
					a.interrupt(); //a stoppen
					aGestoppt = true;
					aBereit = false;
					
				}
				//Wenn a noch nicht läuft
				
				else if (aGestoppt == false){
					a.start(); //a starten
				}
				
				else {
					System.out.println("Stoppuhr A wurde bereits gestoppt!");
				}
			}
		
			//Wenn die Eingabe "B" ist
			if (eingabe.equals("B")) {
			
				eingabe = ("");
				//Wenn b bereits läuft
				if (b.isAlive()) {
					b.interrupt(); //b stoppen
					bGestoppt = true;
					bBereit = false;
				}
				//Wenn b noch nicht läuft
				
				else if (bGestoppt == false){
					b.start(); //b starten
				}
				
				else {
					System.out.println("Stoppuhr B wurde bereits gestoppt!");
				}
				
			}
			
			else {
				System.out.println("Eingabe: ");
				eingabe = (scanner.nextLine());
			}
			//ende while
		}
		
		
	}
 
	public void run() {
		while (true) {
			this.repaint();
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
			}
		}
	}
 
	public void paint(Graphics g) {
		
		g.clearRect(0, 0, getWidth(), getHeight());
		
		int h_x, h_y, m_x, m_y, s_x, s_y;
 
		int h, m, s;
 
		Calendar cal = new GregorianCalendar();
		cal.setTimeInMillis(System.currentTimeMillis());
 
		h = cal.get(Calendar.HOUR);
		m = cal.get(Calendar.MINUTE);
		s = cal.get(Calendar.SECOND);
 
		h_x = (int) (radh * Math.sin(2 * Math.PI / 720 * (h * 60 + m)) + c_x);
		h_y = (int) (radh
				* Math.cos(2 * Math.PI / 720 * (h * 60 + m) + Math.PI) + c_y);
 
		m_x = (int) (radms * Math.sin(2 * Math.PI / 60 * m) + c_x);
		m_y = (int) (radms * Math.cos(2 * Math.PI / 60 * m + Math.PI) + c_y);
 
		s_x = (int) (radms * Math.sin(2 * Math.PI / 60 * s) + c_x);
		s_y = (int) (radms * Math.cos(2 * Math.PI / 60 * s + Math.PI) + c_y);
 
		g.setColor(Color.DARK_GRAY);
 
		g.fillOval(c_x - radms - 15, c_y - radms - 15, radms * 2 + 30,
				radms * 2 + 30);
 
		g.setColor(Color.LIGHT_GRAY);
 
		g.fillOval(c_x - radms - 10, c_y - radms - 10, radms * 2 + 20,
				radms * 2 + 20);
 
		g.fillRect(c_x + 35, c_y - 10, 20, 20);
 
		g.setColor(Color.DARK_GRAY);
		
		g.fillOval(c_x - 3, c_y - 3, 6, 6);
 
		g.drawLine(c_x, c_y, h_x, h_y);
		g.drawLine(c_x, c_y, m_x, m_y);
		g.drawLine(c_x, c_y, s_x, s_y);
		
		
		g.drawString("" + h + ":" + m + ":" + s, c_x - 50, c_y + 110); //digitaluhr
		
		
		
	}
}







class Stoppuhr extends Thread {

	/**
	 * Der Stoppuhr-Thread
	 * Gibt beim starten die aktuelle Uhrzeit und beim Beenden die Uhrzeit + Dauer aus
	 */
	public void run() {
		
		// Uhrzeit am Anfang
		int zeitStundenAnfang = 0;
		int zeitMinutenAnfang = 0;
		int zeitSekundenAnfang = 0;
		
		
		// aktuelle Uhrzeit mit Nachkommastellen:
		double zeitStundenHeute = 0;
		double zeitMinutenHeute = 0;
		double zeitSekundenHeute = 0;
		
		// aktuelle Uhrzeit ohne Nachkommastellen:
		int zeitStundenAusgabe = 0;
		int zeitMinutenAusgabe = 0;
		int zeitSekundenAusgabe = 0;
		
		int start = 0; // Damit der eine Ausgabe nur einmal ausgibt
		int z = 1; // Für die While-Schleife
		
		while (z == 1) {
			
			// Interrupt:
			if (isInterrupted()) {
				int dauerMinuten = (int) (zeitMinutenHeute - zeitMinutenAnfang);
				int dauerSekunden = (int) (zeitSekundenHeute - zeitSekundenAnfang);
				
				// Die Zahlen werden in einen String umgewandelt, damit man nacher eine "0" vorsetzen kann
				String zeitSekundenAusgabeS = ("" + zeitSekundenAusgabe);
				String zeitMinutenAusgabeS = ("" + zeitMinutenAusgabe);
				String dauerMinutenS = ("" + dauerMinuten);
				String dauerSekundenS = ("" + dauerSekunden);
				
				
				
				//Macht die Anfangssekunden zweistellig, sofern < 10
				if (zeitSekundenAusgabe < 10) {
					zeitSekundenAusgabeS = ("0" + zeitSekundenAusgabe); 
				}
				
				//Macht die Anfangsminuten zweistellig, sofern < 10
				if (zeitMinutenAusgabe < 10) {
					zeitMinutenAusgabeS = ("0" + zeitMinutenAusgabe);
				}
				//Macht die Sekunden der Dauer zweistellig, sofern < 10
				if (dauerSekunden < 10) {
					dauerSekundenS = ("0" + dauerSekunden);
				}
				//Macht die Minuten der Dauer zweistellig, sofern < 10
				if (dauerMinuten < 10) {
					dauerMinutenS = ("0" + dauerMinuten);
				}
				
				//Ausgabe:
				System.out.println("Es ist: " + zeitStundenAusgabe + ":" + zeitMinutenAusgabeS + ":" + zeitSekundenAusgabeS + " Uhr. Dauer: " + dauerMinutenS + ":" + dauerSekundenS + " min");
				
				break;
			}
			
			
			
			
			// Uhrzeiten berechnen:
			
			long zeit = System.currentTimeMillis();
			
			//Zeit von Mitternacht 01.01.1970 bis heute:
			double zeitSekunden = zeit / 1000.00; //Sekunden
			double zeitMinuten = zeitSekunden / 60.00; //Minuten
			double zeitStunden = zeitMinuten / 60.00; // Stunden
			
			//aktuelle Uhrzeit:
			zeitStundenHeute = 2 + zeitStunden % 24; //Stunden (heute)
			zeitMinutenHeute = zeitMinuten % 60; // Minuten (heute)
			zeitSekundenHeute = zeitSekunden % 60; // Sekunden (heute)
			
			//Werte ohne Nachkommastellen:
			zeitStundenAusgabe = (int)zeitStundenHeute;
			zeitMinutenAusgabe = (int)zeitMinutenHeute;
			zeitSekundenAusgabe = (int)zeitSekundenHeute;
			
			
			
			//Wird einmal beim Starten des Threads ausgeführt
			while (start < 1) {
				zeitStundenAnfang = (int)zeitStundenHeute;
				zeitMinutenAnfang = (int)zeitMinutenHeute;
				zeitSekundenAnfang = (int)zeitSekundenHeute;
				
				//Anfangssekunden- und Minuten als String
				String zeitSekundenAnfangS = ("" + zeitSekundenAnfang);
				String zeitMinutenAnfangS = ("" + zeitMinutenAnfang);
				
				
				
				//Macht die Anfangssekunden zweistellig
				if (zeitSekundenAnfang < 10) {
					zeitSekundenAnfangS = ("0" + zeitSekundenAnfang); 
				}
				//Macht die Anfangsminuten zweistellig
				if (zeitMinutenAnfang < 10) {
					zeitMinutenAnfangS = ("0" + zeitMinutenAnfang);
				}
				System.out.println("Es ist: " +zeitStundenAnfang + ":" + zeitMinutenAnfangS + ":" + zeitSekundenAnfangS + "Uhr");
				start++;
			}
		}
	}
}