# 12 Stunden Uhrenanzeige realiesieren in BlueJ!



## ulib83 (22. Okt 2007)

*Brauche mal ganz dirngend eure Hilfe sitz schon ewig dran aber bekomm nix hin.

Hier soll aus dem vorgegebenen Quelltext eine 12 h Uhr gemacht werden mit am und pm z.b. Der vorliegende Quelltext ist für eine 24 h Anzeige konzipiert.

Der erste Quelltext ist der der Klasse Uhrenanzeige der 2te der der Klasse Nummernanzeige!*




```
* Die Klassen Uhrenanzeige implementiert die Anzeige einer Digitaluhr.
 * Die Anzeige zeigt Stunden und Minuten. Der Anzeigebereich reicht von
 * 00:00 (Mitternacht) bis 23:59 (eine Minute vor Mitternacht).
 *
 * Eine Uhrenanzeige sollte min¸tlich "Taktsignale" (¸ber die Operation
 * "taktsignalGeben") erhalten, damit sie die Anzeige aktualisieren 
 * kann. Dies geschieht, wie man es bei einer Uhr erwartet: Die 
 * Stunden erhˆhen sich, wenn das Minutenlimit einer Stunde erreicht
 * ist.
 * 
 */
public class Uhrenanzeige
{
    private Nummernanzeige stunden;
    private Nummernanzeige minuten;
    private String zeitanzeige;    // simuliert die tats‰chliche Anzeige
    
    /**
     * Konstruktor f¸r ein Exemplar von Uhrenanzeige.
     * Mit diesem Konstruktor wird die Anzeige auf 00:00 initialisiert.
     */
    public Uhrenanzeige()
    {
        stunden = new Nummernanzeige(24);
        minuten = new Nummernanzeige(60);
        anzeigeAktualisieren();
    }

    /**
     * Konstruktor f¸r ein Exemplar von Uhrenanzeige.
     * Mit diesem Konstruktor wird die Anzeige auf den Wert
     * initialisiert, der durch 'stunde' und 'minute' 
     * definiert ist.
     */
    public Uhrenanzeige(int stunde, int minute)
    {
        stunden = new Nummernanzeige(24);
        minuten = new Nummernanzeige(60);
         setzeUhrzeit(stunde, minute);
       
    }

    /**
     * Diese Operation sollte einmal pro Minute aufgerufen werden -
     * sie sorgt daf¸r, dass diese Uhrenanzeige um eine Minute
     * weiter gestellt wird.
     */
    public void taktsignalGeben()
    {
        minuten.erhoehen();
        if(minuten.gibWert() == 0) {  // Limit wurde erreicht!
            stunden.erhoehen();
        }
        anzeigeAktualisieren();
    }

    /**
     * Setze die Uhrzeit dieser Anzeige auf die gegebene 'stunde' und
     * 'minute'.
     */
    public void setzeUhrzeit(int stunde, int minute)
    {
        stunden.setzeWert(stunde);
        minuten.setzeWert(minute);
        anzeigeAktualisieren();
    }

    /**
     * Liefere die aktuelle Uhrzeit dieser Uhrenanzeige im Format SS:MM.
     */
    public String gibUhrzeit()
    {
        return zeitanzeige;
    }
    
    /**
     * Aktualisiere die interne Zeichenkette, die die Zeitanzeige h‰lt.
     */
    private void anzeigeAktualisieren()
    {
        zeitanzeige = stunden.gibAnzeigewert() + ":"
                      + minuten.gibAnzeigewert();
    }
}

[b]AB HIER IST ES DIE NUMMERNANZEIGE[/b]


/**
 * Die Klasse Nummernanzeige repr‰sentiert Darstellungen von
 * digitalen Werten, die von Null bis zu einem vorgegebenen Limit
 * reichen kˆnnen. Das Limit wird definiert, wenn eine Nummernanzeige
 * erzeugt wird. Die darstellbaren Werte reichen von Null bis Limit-1.
 * Wenn beispielsweise eine Nummernanzeige f¸r die Sekunden einer
 * digitalen Uhr verwendet werden soll, w¸rde man ihr Limit auf 60
 * setzen, damit die dargestellten Werte von 0 bis 59 reichen.
 * Wenn der Wert einer Nummernanzeige erhˆht wird, wird bei Erreichen
 * des Limits der Wert automatisch auf Null zur¸ckgesetzt.
 */
public class Nummernanzeige
{
    private int limit;
    private int wert;
   
   

    /**
     * Konstruktor f¸r Exemplare der Klasse Nummernanzeige.
     * Setzt das Limit, bei dem die Anzeige zur¸ckgesetzt wird.
     */
    public Nummernanzeige(int anzeigeLimit)
    {
        limit = anzeigeLimit;
        wert = 0;
       
    }

    /**
     * Liefere den aktuellen Wert als int.
     */
    public int gibWert()
    {
        return wert;
    }

    /**
     * Liefere den Anzeigewert, also den Wert dieser Anzeige als
     * einen String mit zwei Ziffern. Wenn der Wert der Anzeige
     * kleiner als zehn ist, wird die Anzeige mit einer f¸hrenden
     * Null einger¸ckt.
     */
    public String gibAnzeigewert()
    {
        if(wert < 10) {
            return "0" + wert;
        }
       
        
        else {
            return "" + wert;
        }
    }  
    
        
       
        

    /**
     * Setze den Wert der Anzeige auf den angegebenen 'ersatzwert'.
     * Wenn der angegebene Wert unter Null oder ¸ber dem Limit liegt,
     * tue nichts.
     */
    public void setzeWert(int ersatzwert)
    {
        if((ersatzwert >= 0) && (ersatzwert < limit)) {
            wert = ersatzwert;
        }
        
        else{
            System.out.println("Fehleingabe");
        }
    }

    /**
     * Erhˆhe den Wert um Eins. Wenn das Limit erreicht ist, setze
     * den Wert wieder auf Null.
     */
    public void erhoehen()
    {
        wert = (wert + 1) % limit;
    }
    
    // Buch S 101 Übung 3.20
    public void erhoehen2()
    {
        if( wert + 1 < limit){
        wert += 1;
    }
       else{
           wert = 0;
        }
}
}
```


----------



## wayne (22. Okt 2007)

soll die uhrzeit beim starten eigentlich immer 00:00 anzeigen oder sollte das nicht eher die aktuelle uhrzeit sein? ich frage deshalb, weil ich mir nicht ganz schlüssig bin, warum du dir die arbeit machst, eigene verwaltungsstrukturen für die uhrzeit zu schreiben, wenn es die bereits in java gibt. stichwort Calendar bzw. GregorianCalendar und stichwort Thread. bei Calendar kannst du dir sogar die zeit mit am und pm ausgeben lassen, womit wohl auch dein nächstes problem gelöst wäre. eigentlich brauchst du für die realisierung einer solchen uhr, unter der verwendung dieser beiden klassen, nur eine view. 

diese view aktualisierst du minütlich mittels eines threads. das ganze könnte in etwa so aussehen:

```
class MyView extends JComponent {

    private Calendar calendar;

    public MyView(){
        ...
        calendar = new GregorianCalendar(Locale.GERMAN);
        new Takt().start();        
    }

...


    public void paintComponent(Graphics g){
        String time = String.valueOf(calendar.get(Calendar.HOUR_OF_DAY)) + ":" +
                      String.valueOf(calendar.get(Calendar.MINUTE));
        g.drawString(time,0,0,null);
    }

...

    class Takt extends Thread {
        public void run(){
            while( !isInterrupted() ){
                waitForAMinute();
                repaint();
            }
        }

        private synchronized void waitForAMinute(){
            try {
                sleep(60000); // millisekunden; alternativ geht hier auch wait(...)
            }
            catch( Exception e ){
                e.printStacktrace();
            }
        }
    }
}
```

oder denk ich da zu einfach? 

viel erfolg

wayne


----------



## Guest (22. Okt 2007)

wayne hat gesagt.:
			
		

> soll die uhrzeit beim starten eigentlich immer 00:00 anzeigen oder sollte das nicht eher die aktuelle uhrzeit sein? ich frage deshalb, weil ich mir nicht ganz schlüssig bin, warum du dir die arbeit machst, eigene verwaltungsstrukturen für die uhrzeit zu schreiben, wenn es die bereits in java gibt. stichwort Calendar bzw. GregorianCalendar und stichwort Thread. bei Calendar kannst du dir sogar die zeit mit am und pm ausgeben lassen, womit wohl auch dein nächstes problem gelöst wäre. eigentlich brauchst du für die realisierung einer solchen uhr, unter der verwendung dieser beiden klassen, nur eine view.
> 
> diese view aktualisierst du minütlich mittels eines threads. das ganze könnte in etwa so aussehen:
> 
> ...





nein das nützt mir nix, es muss einfach nur irgendwas verändert werden an meinem Quelltext nur eine Methode oder so umgeschrieben werden keine Ahnung, es muss halt im BlueJ funktionieren und die Uhr ist immer bei 00:00 am Anfang weil ich ja noch keine Instanz erzeugt habe. Es muss so sein das wenn ich die Methode " gibAnzeigewert" aufrufe und vorher z.b. die uhr auf 13 Uhr gestzt habe muss es dann mir 1 uhr anzeigen wegen 12h Uhr!!


----------



## babuschka (22. Okt 2007)

nein das nützt mir nix, es muss einfach nur irgendwas verändert werden an meinem Quelltext nur eine Methode oder so umgeschrieben werden keine Ahnung, es muss halt im BlueJ funktionieren und die Uhr ist immer bei 00:00 am Anfang weil ich ja noch keine Instanz erzeugt habe. Es muss so sein das wenn ich die Methode " gibAnzeigewert" aufrufe und vorher z.b. die uhr auf 13 Uhr gestzt habe muss es dann mir 1 uhr anzeigen wegen 12h Uhr!!


----------



## Gast (23. Okt 2007)

Du musst vermutlich bloss die gibAnzeigewert() Methode anpassen.


----------



## wayne (23. Okt 2007)

BlueJ kenn ich nicht und kann dir von dem her diesbezüglich auch net helfen. zu meiner lösung könnte ich aber noch sagen, daß du selbstverständlich nicht nur die aktuelle uhrzeit von Calendar erhalten kannst, sondern auch eine selbst gesetzte. das geht mittels calendar.set(Calendar.HOUR_OF_DAY,x); und calendar.set(Calendar.MINUTE,y);. so könntest du bei instanziierung erst mal die uhr auf 00:00 setzen und jederzeit die uhrzeit beliebig umsetzen lassen. soweit ich Calendar verstanden habe, läuft die uhrzeit anschließend im normalen turnus weiter, nur halt entsprechend deinen bedürfnissen verändert.

viel erfolg

wayne


----------



## babuschka (23. Okt 2007)

Gast hat gesagt.:
			
		

> Du musst vermutlich bloss die gibAnzeigewert() Methode anpassen.



ja das hab ich mir auch schon gedacht aber ich bekomme es einfach nicht hin kannst du mir vieleicht sagen wie ich die Methode gibAnzeigewert anpassen muss???


----------



## Guest (23. Okt 2007)

```
/** 
     * Liefere den Anzeigewert, also den Wert dieser Anzeige als 
     * einen String mit zwei Ziffern. Wenn der Wert der Anzeige 
     * kleiner als zehn ist, wird die Anzeige mit einer f¸hrenden 
     * Null einger¸ckt. 
     */ 
    public String gibAnzeigewert() 
    { 
        if(wert < 10) { 
            return "0" + wert; 
        } 
        
        
        else { 
            return "" + wert; 
        } 
    }
```

vielleicht so...

```
/** 
     * Liefere den Anzeigewert, also den Wert dieser Anzeige als 
     * einen String mit zwei Ziffern. Wenn der Wert der Anzeige 
     * kleiner als zehn ist, wird die Anzeige mit einer f¸hrenden 
     * Null einger¸ckt. 
     */ 
    public String gibAnzeigewert() 
    { 
        if(wert < 10) { 
            return "0" + wert + " am"; 
        } 
        
        if(wert > 12) {
            
            int k = 0;

            for (int i = 12, i < wert , i++){
                
                k++;
                                       }
            
            if(k < 10) {
              return "0" + k + " pm";
                            }
            else { 
                return k + "pm";
}

    }
```
so stell ich mir das jetz vor kann es grad nicht testen... bin aber selber noch Javaneuling also mal keine garantie...


----------



## Ariol (23. Okt 2007)

Ähm mal ganz dumm gefragt - reicht es nicht, wenn du in den Konstruktoren von Uhrenanzeige statt

```
stunden = new Nummernanzeige(24);
```

das hier schreibst

```
stunden = new Nummernanzeige(12);
```

und in der Nummernmethode die Methode setzeWert so umschreibst.


```
public void setzeWert(int ersatzwert)
    {
        if(ersatzwert >= 0) {
            wert = ersatzwert%limit;
        }
       
        else{
            System.out.println("Fehleingabe");
        }
    }
```

Meiner meinung nach sollte das schon reichen, oder?
Versuchs mal!


----------



## Xams (23. Okt 2007)

Anonymous hat gesagt.:
			
		

> , es muss halt im BlueJ funktionieren





			
				Google hat gesagt.:
			
		

> BlueJ is a Java IDE specifically designed to learn and teach object-oriented programming and Java.



Warum hält dich das von ab einfach die KLasse Calendar zu verwenden???


----------



## Gast (23. Okt 2007)

@ Ariol...

ich glaube du hast da noch was vergessen... wie bekommst du dann raus ob PM oder AM?

Grüße...

Mr


----------



## Ariol (23. Okt 2007)

Hmm, wenn ich mir die vorgegebenen Klassen ansehe und dann daran denke, was wir am Anfang so mit BlueJ gemacht haben....

Calendar u.ä. könnte etwas zu hoch gegriffen sein.

Mit BlueJ lernt man zwar gut, aber nicht gerade komfortabel.

--------------------

Außerdem, ich weiß zwar nicht hundertprozentig, ob meine Lösung funktioniert, aber wenn, dann ist es um längen einfacher, als das komplette Programm nach Calendar oder sonstwas umzuscheiben


----------



## NTB (23. Okt 2007)

Xams hat gesagt.:
			
		

> Warum hält dich das von ab einfach die KLasse Calendar zu verwenden???



Boa... weil das eine Übungsaufgabe ist, der Quelltext exakt so vorgegeben ist und er nur verändert werden soll! Wildes Umbauen ist möglich, aber ganz sicher nicht gefragt. Kann man sich das nicht denken?

Zum Topic: Müsste es nicht einfach reichen, Nummernanzeige mit 12 aufzurufen und fertig ist die Kiste? Habs mir jetzt nicht sooo genau angeschaut...


----------



## babuschka (24. Okt 2007)

Anonymous hat gesagt.:
			
		

> vielleicht so...
> 
> ```
> /**
> ...



*
Also ich hab es getestet und bei mir kommt immer in dieser Zeile
	
	
	
	






		Code:In die Zwischenablage kopieren


 for (int i = 12, i < wert , i++){

 "; expected"* aber ich find kein fehlendes Semikolon!!


----------



## Azubi (24. Okt 2007)

3X3CUT3 hat gesagt.:
			
		

> Also ich hab es getestet und bei mir kommt immer in dieser Zeile
> 
> 
> 
> ...


Ich find gleich zwei. Nach der 12 und nach wert...


----------



## Gast (24. Okt 2007)

```
for (int i = 12; i < wert; i++){
```


----------



## babuschka (24. Okt 2007)

danach ist zwar dieser fehler weg aber dann bringt er "missing return statement" !!


----------



## Azubi (24. Okt 2007)

3X3CUT3 hat gesagt.:
			
		

> danach ist zwar dieser fehler weg aber dann bringt er "missing return statement" !!


Na was wird das wohl heissen?

```
public String gibAnzeigewert()
```
Deine Methode muss einen String zurückgeben.


----------



## babuschka (24. Okt 2007)

ja aber wie mach ich das dann weil ich will es ja nicht in der Konsole ausgeben es soll ja nur das Datenfeld geäändert werden. Kann mir nicht einer den Quelltext von der Methode gibAnzeigewert nochmal richtig stellen??


----------



## Gast (24. Okt 2007)

Hab doch nichts von Konsole ausgeben gesagt oder?

Du brauchst ein return nach dem ganzen if else Konstrukt. Würde eh vorschlagen, dass ganze in eine Variable (z.B. String rtnvalue) zu speichern und am Ende der Methode nur return rtnvalue zu schreiben.

Wieso dir das richtig stellen? Willst es doch lernen und mit den Hinweisen ist dies ja durchaus zu bewerkstelligen.


----------



## babuschka (24. Okt 2007)

3X3CUT3 hat gesagt.:
			
		

> Anonymous hat gesagt.:
> 
> 
> 
> ...


----------



## Guest (24. Okt 2007)

3X3CUT3 hat gesagt.:
			
		

> *Warum geht das denn nicht es kommt immer n ur Fehler kann mir jemand helfen und die Methode richtig stellen?*


Es geht nicht, weil er auch ein return außerhalb der if-else Konstruktion verlangt.
Mach am Anfang der Methode ein String anzeige;
Statt den returns machste anzeige = (was beim return stand)
und am Ende der Methode machst du nur noch return anzeige


----------



## Guest (24. Okt 2007)

ohh ja ... entschuldigt bitte meine schlampige Lösung... war nur schnell dahin getippt...

ich glaub der Gast vor mir meinte das so...



```
/** 
     * Liefere den Anzeigewert, also den Wert dieser Anzeige als 
     * einen String mit zwei Ziffern. Wenn der Wert der Anzeige 
     * kleiner als zehn ist, wird die Anzeige mit einer f¸hrenden 
     * Null einger¸ckt. 
     */ 
    public String gibAnzeigewert() 
    { 

    String anzeige = null;

        if(wert < 10) { 
            anzeige = "0" + wert + " am"; 
        } 
        
        if(wert > 12) { 
            
            int k = 0; 

            for (int i = 12; i < wert ; i++){ 
                
                k++; 
                                       } 
            
            if(k < 10) { 
              anzeige = "0" + k + " pm"; 
                            } 
            else { 
                anzeige =  k + " pm"; 
} 
    return anzeige;

    }
```

Grüße

Mr.


----------



## Ariol (24. Okt 2007)

Ich weiss nicht was euer Problem ist, es reicht wirklich in den Konstruktoren der Klasse Uhranzeige

```
stunden = new Nummernanzeige(12);
```
statt

```
stunden = new Nummernanzeige(24);
```
schreiben.

Getestet hab ichs hiermit:

```
public class UhranzeigeTest
{

	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		Uhrenanzeige uhrenanzeige = new Uhrenanzeige();
		for(int i = 0; i < 24; i++)
		{
			for(int j = 0; j < 60; j++)
			{
				uhrenanzeige.taktsignalGeben();
			}
			System.out.println(uhrenanzeige.gibUhrzeit());
		}
	}

}
```

Ausgabe war:

```
01:00
02:00
03:00
04:00
05:00
06:00
07:00
08:00
09:00
10:00
11:00
00:00
01:00
02:00
03:00
04:00
05:00
06:00
07:00
08:00
09:00
10:00
11:00
00:00
```


Wozu also der Stress?? Hab ich was falsch verstanden???


----------



## Mr. (24. Okt 2007)

@ Ariol 


Einfach ist deine Lösung das stimmt aber wie erkennst du nun ob es 1  pm oder 1 am ist?? das kann man nämlich dann nicht mehr... da man ja nur eine Zeitbasis vin 12h hat... oder versteh ich da was falsch??

Grüße

Mr.


----------



## Ariol (24. Okt 2007)

ok, das stimmt


----------



## tester (24. Okt 2007)

Also ich hab das nun auch nochmal probiert... du musst noch mehr machen als nur gibanzeigewert zu ändern... da er hier auch die zeitbasis 60  verwendet...


----------



## Tester (24. Okt 2007)

```
public String gibAnzeigewert()
    {

    String anzeige = null;

        if(wert < 10) {
            anzeige = "0" + wert + " am";
        }
       if (wert >= 10 && wert <= 12) {
        anzeige = wert + " am";
       }
        if(wert > 12) {
           
            int k = 0;

            for (int i = 12; i < wert ; i++){
               
                k++;
                                       }
           
            if(k < 10) {
              anzeige = "0" + k + " pm";
                            }
            else {
                anzeige =  k + " pm";
}
    

        }
   return anzeige;
}
```

damit kommt folgendes raus

01 am:00 am
02 am:00 am
03 am:00 am
04 am:00 am
05 am:00 am
06 am:00 am
07 am:00 am
08 am:00 am
09 am:00 am
10 am:00 am
11 am:00 am
12 am:00 am
01 pm:00 am
02 pm:00 am
03 pm:00 am
04 pm:00 am
05 pm:00 am
06 pm:00 am
07 pm:00 am
08 pm:00 am
09 pm:00 am
10 pm:00 am
11 pm:00 am
00 am:00 am


----------



## 3X3CUT3. (27. Okt 2007)

ICH HAB DIE LÖSUNG laut Lösungsbuch gefunden(danke trotzdem an allle):


```
/** 
 * Aktualisieren Sie den internen String, der die Anzeige 
repräsentiert. 
 */ 
private void anzeigeAktualisieren() 
{ 
    int stunde = stunden.gibWert(); 
    String suffix = "am"; 
    if(stunde >= 12) { 
        stunde = stunde - 12; 
        suffix = "pm"; 
    } 
    if(stunde == 0) { 
        stunde = 12; 
    } 
    zeitanzeige = stunde + "." + minuten.gibAnzeigeWert() + suffix; 
} 
 
2) 
 
public Uhrenanzeige() 
{ 
    stunden = new Uhrenanzeige (12); //geaendert 
    Minuten = new Uhrenanzeige (60); 
    anzeigeAktualisieren(); 
} 
 
public Uhrenanzeige (int hour, int minute) 
{ 
    stunden = new Uhrenanzeige (12); //geaendert 
    minuten = new Uhrenanzeige (60); 
    setzeUhrzeit(stunde, minute); 
} 
 
private void anzeigeAktualisieren() 
{ 
    int stunde = stunden.gibWert(); 
    if(stunde == 0) { 
        stunde = 12; 
    } 
   zeitanzeige = stunde + "." + minuten.gibAnzeige}

}
```


----------

