# Steuerung von Ampeln



## alias_host (22. Nov 2006)

Also wir haben neu in der schule mit oop angefangen. Wir haben eine Aufgabe bekommen, in der wir eine kreuzung mit 4 ampeln programmieren müssen. ich habe eine klasse GUI, eine Steuerung und eben eine Ampel. Ich möchte dann 4 objekte von der Klasse Ampel erstellen. Nun die frage.:

wer übernimmt welche aufgaben.
Zeichnet die ampel sich selbst?
Wenn die Ampeln sich selbst zeichnen, ist jedes objekt ja wieder individuell für die Position der Ampel ob sie liegt auf dem Kopf steht...
berechnet die Ampel ihre zustände oder die Steuerung?
wie soll ich beim zeichnen auf das canvas des GUI zugreifen?

Wäre nett, wenn ihr mir helfen könntet.

Mfg Alias_host


----------



## SnooP (22. Nov 2006)

Eine Ampel ist das eigentliche Modell und besitzt vermutlich sowas wie vier Zustände: grün, gelb, rot, gelb-rot am einfachsten über eine Enumeration oder halt über Konstanten und einer Variablen z.B. int status.

Dazu die entsprechenden get/set-Methoden für diesen Status, bzw. sowas wie changeState(), die je nach aktuellem Status in den nächsten wechselt: grün -> gelb -> rot -> gelb-rot -> grün usw.

Die Steuerung hält alle Ampeln am besten in einem Array und implementiert in einer run-Methode (Threads bekannt?) die eigentliche Ampelsteuerung, also die einzelnen Phasen der Kreuzung. Zu entsprechenden Zeitpunkten werden die zusammengehörenden Ampeln weitergeschaltet.. dazu kann man auch entsprechende Methoden schreiben die das erledigen... 

die run-Methode sollte sowas wie nen timer haben, sprich immer wenn sie aufgerufen wird, wird eine zeitvariable inkrementiert, bis das Ende der Ampelphasen erreicht wird und alles wieder von vorne beginnt (dann kann die variable auf 0 gesetzt werden)...

die GUI wiederum beinhaltet grafische Komponenten zur Darstellung der Ampeln. Diese Komponenten können entweder auf die Steuerung zugreifen (fragen diese "ständig" ab) oder aber die Steuerung benachrichtigt die GUI falls sich der Status einer Ampel ändert... das ist das Observer-Prinzip und wäre schon sehr hübsch oop. Dazu gibt es auch bereits Java-Klassen: Observer und Interface Observable... oder andersrum?  - da war irgendwas komisch...

Also kurz gesacht... die GUI ist zum Malen da... die Steuerung halt für die Steuerung, also das umschalten der Ampeln und die Ampeln selbst können wirklich nur das, was ampeln können... einen Zustand einnehmen und dafür nen entsprechenden Schalter nach außen bieten: schalteMichWeiter...


----------



## alias_host (22. Nov 2006)

Danke!!! du hast mir sehr weitergeholfen!!!!


----------



## alias_host (22. Nov 2006)

ich habe versuchtdie meldung über die klasse observable zu verschicken. dann muss ich aber doch ein neues objekt von der klasse GUI erzeugen oder?

Observer f= new GUI();

oder wie mache ich das?

ich möchte ja ein schon existierendes objekt benachrichtigen...


----------



## SlaterB (22. Nov 2006)

das existierende Objekt muss sich vorher angemeldet haben,

z.B. mit add(this), irgendwann muss mal ein Kontakt dagewesen sein,

dann hat die Steurerung eine Referenz auf die GUI 
und kann eine Benachrichtigungs-Operation zum rechten Zeitpunkt rufen


----------



## alias_host (22. Nov 2006)

Kannst du die Anmeldung etwas ausführlicher schreiben?


----------



## byte (22. Nov 2006)

Das steht doch in der Java API: 


```
observable.addObserver(observer);
```


----------



## SlaterB (22. Nov 2006)

was kann man denn daran nicht verstehen?

wenn ein Objekt A ein Objekt B aufrufen will,
dann braucht es eine Referenz auf B,
so dass es b.doSomething() aufrufen kann

diese Referenz muss irgendwo herkommen,
z.B. eine Exemplarvariable b in a,
dann muss b im Konstrutor mitangegeben werden oder später mit
a.setB(b); gesetzt werden,

das ist doch das total grundlegend,
damit ein Objekt ein andere rufen kann braucht es eine Referenz darauf?!

nur weil man das ganze hochtrabend Observer/ Observerable nennt ändert sich an diesem Grundsatz nix,
damit ein Observerable einen Observer informieren kann braucht es eine Referenz auf diesen Oberserver,
sonst weiß das Observerable ja nicht mal, dass es da draußen irgendeinen interessierten gibt 

void 	addObserver(Observer o)
          Adds an observer to the set of observers for this object, provided that it is not the same as some observer already in the set.

ist hier die fragliche Operation,
http://java.sun.com/j2se/1.5.0/docs/api/java/util/Observable.html


kennst du ActionListener? das ist das gleiche
wie soll ein Button einen ActionListener informieren,
wenn niemals
buttom.addActionListener(listener) aufgerufen wird


----------



## SnooP (23. Nov 2006)

Ich glaube das mit den Referenzen ist/war dem OP nicht ganz klar  - immerhin steht in seinem ersten Satz was von Schule und oop - das muss ja haken!


----------

