Die hier vorgestellte Facharbeit ist eine Kombination aus zwei Bereichen, einem Software- und einem Hardwareteil. Hier wird auf den Softwareteil eingegangen, der in Java implementiert wird. Die Anforderung war es ein Modell einer Ampelanlage in Hard- und Software zu realisieren.
Die Anbindung zwischen Hard- und Software erfolgt durch nativen C++ Code, der dynamisch in die Java-Applikation eingebunden wird.
Dazu wird das System Objektorientiert analysiert, es ergeben sich bestimmte Objekte, die im objektorientierten Design weiter spezifiziert werden:
Es gibt zum Einen verschiedene Typen von Ampeln, die auf Kommando eine Ampelphase anzeigen können, nämlich Verkehrs-, Abbieger- und Fußgängerampeln.
Diese Ampeln bestehen wiederum aus verschiedenen Ampellichtern, die ein- und ausgeschaltet werden können. Ferner haben sie verschiedene Farben und Erscheinungsbilder.
Zum Anderen werden diese Ampeln in Komplexen zusammengefaßt, damit sie hier synchronisiert und koordiniert werden können. Durch die Nebenläufigkeit von Java geht die Parallelisierung der einzelnen Ampel problemlos vonstatten.
Hier muß zwischen einem allgemeinen Komplexobjekt und speziellen für die hier betrachtete Anlage entworfenen Komplexen unterschieden werden. Ein Großteil der hier beschriebenen Klassen könnte jedoch auch in anderen Ampelanlagen wiederverwendet werden.
Schließlich muß das ganze in einem Fenster zusammengefaßt und angezeigt werden, dieses sollte einerseits durch einen Interpreter, andererseits durch einen Browser möglich sein, auch hierfür werden spezielle Klassen zur Verfügung gestellt.
ampel.steuerung.Ampellicht
ampel.steuerung.VerkehrsAmpel
ampel.steuerung.SuedKomplex
ampel.steuerung.OstKomplex
ampel.steuerung.AmpelFrame
Die Aufgabe ist es, ein bestimmtes Verkehrsleitsystem, nämlich dasjenige an der Kreuzung Brombeer-, bzw. Maienweg / Ratsmühlendamm als Computermodell darzustellen. Dazu werden zunächst in zwei Teile unterschieden: erstens die Hardware und die hardwarenahe Programmierung der Schnittstelle, zweitens die Steuerung und grafische Darstellung des Systems am Computer (die Software).
Die Kommunikation zwischen Hard- und Softwareteil wird über die Möglichkeit der nativen Codeeinbindung in Java betrieben.
Hier soll auf die Steuerung und Darstellung eingegangen werden. Da die Implementation in Java erfolgen soll, wird das System zunächst objektorientiert analysiert und designiert.
Die hier entwickelte Software basiert auf und verwendet die von Sun Microsystems zur Verfügung gestellten Java-Entwicklungsumgebung JDK Version 1.0.
Hier stellt sich die Frage, was es zunächst überhaupt für Objekte gibt. Wir betrachten also zunächst einmal Verkehrsleitsysteme im Allgemeinen. Woraus bestehen sie? Aus Ampeln, die in Komplexen zusammengefaßt werden können.
Diese Komplexe zeichnen sich dadurch aus, daß wenn einer von ihnen aktiv ist, d.h., daß genau dann wenn mindestens eine zu ihm gehörige Ampel nicht auf rot geschaltet ist, alle anderen inaktiv sein müssen. Andernfalls wäre das System nicht mehr eindeutig und also völlig unnütz. Komplexe müssen sorgfältig geplant werden, damit keine Unfälle entstehen! Jedes Verkehrsleitsystem besteht aus verschiedenen Komplexen, sie müssen also für unser System noch spezialisiert werden.
Die o.g. Ampeln sind zu ungenau definiert, denn es gibt verschiedene Arten von Ampeln: Verkehrsampeln, Fußgängerampeln und linke und rechte Abbiegerampeln. In unserem System gibt es keine Rechtsabbiegerampeln, so daß wir diese vernachlässigen können. Was haben nun alle Ampeln gemeinsam? Sie bestehen alle aus verschiedenfarbigen Ampellichtern. Außerdem können sie verschiedene Konfigurationen aufweisen; jedoch nur in bestimmter Reihenfolge (z.B. folgt auf "gelb" immer "rot"). Ferner ist die Zeit in der eine Ampel auf "gelb" steht in Deutschland durch die StVO festgelegt, und zwar auf drei Sekunden.
Fußgängerampeln bestehen aus zwei roten, und einem grünen Ampellicht. Sie schalten von rot auf grün, und wieder auf rot.
Verkehrs- und Abbiegerampeln bestehen aus je einem roten, gelben und grünem Ampellicht, wobei die Ampellichter bei der Verkehrsampel als Kreis erscheinen, bei der Abbiegerampel als Pfeil. VA und AA schalten von r auf rot-gelb, von rot-gelb auf grün, von grün auf gelb und von gelb wieder auf rot.
Wie oben schon erwähnt wurde ist es praktisch, bei den Ampellichtern zwischen Ampelkreisen und Ampelpfeilen zu unterscheiden, damit ein eindeutig sichtbarer Unterschied zwischen Verkehrsampeln und Abbiegerampeln zu erkennen ist. FA unterscheiden sich von den anderen Ampeln einfach durch die Farben ihrer Ampelkreise, sie enthalten lediglich der Einfachheit halber keine Ampelmännchen. Ampellichter haben eine Farbe und können ein- und wieder ausgeschaltet werden. Die Farbe kann nur rot, gelb oder grün sein.
Ein Ampelkreis ist ein spezielleres Ampellicht, es stellt sich als Kreis dar.
Ein Ampelpfeil ist ebenfalls ein Ampellicht, es stellt sich allerdings als Pfeil, der nach links (da es in unserem System keine Rechtsabbiegerampeln gibt) zeigt dar.
In Java bietet sich an, das AWT für die grafische Darstellung zu verwenden, da das Programm dann auch auf nicht Intel-basierten Maschinen abläuft; für eine Ansteuerung der eigentlichen Ampelanlage muß jedoch der in C++ geschriebene Code zur Steuerung des Parallelports geändert werden, dies ist jedoch weniger Aufwand als das ganze Programm zu portieren.
Es bietet sich also an, das Ampellicht
in einer abstrakten Klasse AmpelLicht
zu implementieren, die von java.awt.Canvas
abgeleitet ist, da es dann problemlos in einen java.awt.Container
eingebettet werden kann. Diese Klasse enthält statische
Konstanten für die Farben die ein Ampellicht annehmen kann,
jeweils in dunkel und hell und zwar als java.awt.Color
.
Weiterhin enthält sie statische Ganzzahlkonstanten, damit man
dem Konstruktor lediglich eine Zahl zu übergeben braucht. Das
Ampellicht hat zwei nicht statische Attribute, nämlich
die Farbe, die es anzeigt. Wenn es eingeschaltet ist und die
Farbe, die es anzeigt, wenn es ausgeschaltet ist. Sie werden als Color
gespeichert.
Ferner enthält die Klasse Methoden zum ein- und
ausschalten des Ampellichtes, solche, damit sie am Bildschirm die
richtige Größe haben und eine abstrakte, die das Ampellicht am
Bildschirm ausgibt. Wenn ein neues Ampellicht erzeugt wird, so
erhält es einen schwarzen Hintergrund und einen Vordergrund in
der jeweiligen Farbe.
Der Ampelkreis und der Ampelpfeil
werden als zwei Klassen AmpelKreis
und AmpelPfeil
implementiert. Sie erweitern beide das Ampellicht,
indem sie die Methode zur Bildschirmdarstellung
implementieren. Der Ampelkreis erscheint dann als
gefüllter Kreis in der jeweiligen Farbe auf schwarzem
Hintergrund, der Ampelpfeil als entsprechender Pfeil.
Die Ampel wird in einer Klasse Ampel
beschrieben,
die von java.awt.Panel
abstammt, damit sie java.awt.Component
wie auch das AmpelLicht
eines ist, enthalten kann. Ferner implementiert sie
die Schnittstelle java.lang.Runnable
, damit sie parallel mit anderen Ampeln
schalten kann. Ampel
kapselt einerseits die grafische Darstellung der Ampel,
andererseits aber auch die logische Funktionalität.
Da eine Ampel mit anderen Ampeln zusammen schalten kann, muß es eine Möglichkeit geben, dies zu realisieren. Java unterstützt Nebenläufigkeit, es bieten sich hierfür also Threads an. Jede Ampel bekommt ihren eigenen Thread und ist Mitglied in der Threadgruppe eines Komplexes. Wir definieren den Urzustand der Ampel als auf rot geschaltet. Sie enthält eine Methode zum Starten, die den Thread startet, der wiederum die Methode der Ampel aufruft, die eigentlich schaltet: von rot auf gelb-rot wartet, schaltet auf grün usw. Am Ende stoppt sie den Thread.
Die Ampel enthält neben den drei verschiedenfarbigen Ampellichtern noch ein Nummerntextfeld, in der die Zeit, in der die Ampel auf grün steht in Sekunden angezeigt wird. Sie kann hier auch geändert werden, wenn das gewünscht wird. Außerdem enthält sie noch Methoden, die dafür sorgen, das die Ampel in der richtigen Größe angezeigt wird.
Verkehrs- und Abbiegerampeln
erweitern die Ampel in den Klassen VerkehrsAmpel
und AbbiegerAmpel
, sie
unterscheiden sich lediglich darin, was sie ihren Ampellichtern
zuweisen: bei der Verkehrsampel sind es Ampelkreise,
bei der Abbiegerampel Ampelpfeile. Die Fußgängerampel
FussgaengerAmpel
ist ebenfalls von der Ampel abgeleitet, sie
enthält wie die Verkehrsampel Ampelkreise, jedoch
ist ihr mittlerer Ampelkreis nicht gelb, sondern rot.
Die Klasse AmpelKomplex
ist eine allgemeine abstrakte Superklasse für Ampelkomplexe.
Ein Ampelkomplex ist die logische Zusammenfassung mehrerer
Ampeln, die parallel schalten, er stellt diese Ampeln auf
dem Bildschirm dar. Er zeigt nicht in jedem Fall diejenigen
Ampeln an, die man von einer bestimmten Seite der Kreuzung aus
sieht! Dies ist die Aufgabe des Modells.
Ein Komplex enthält eine Threadgruppe. Der Threadgruppe des Komplexes ist Mitglied in der Threadgruppe des Verkehrsleitsystems, der globalen Gruppe für die gesamte Anwendung. In der Threadgruppe sind alle Ampeln, die zu diesem Komplex gehören Mitglieder, damit sie synchronisiert schalten können.
Wenn ein Komplex aktiv ist, d.h. wenn eine
der Ampeln, die logisch zu diesem Komplex gehören nicht auf rot
steht, dürfen alle anderen Komplexe, die zu seinem System
gehören nicht aktiv sein! Aus diesem Grunde enthält AmpelKomplex
eine
Methode, die kontrolliert, ob noch Ampeln aktiv sind. Sie kehrt
erst dann zurück, wenn keiner der Threads in der Threadgruppe
des Komplexes mehr aktiv ist.
Die bis jetzt genannten Objekte sind in dieser Form in jedem beliebigen Verkehrsleitsystem verwendbar. Was nun folgt, ist das Design von speziell für das hier behandelte System verwendeten Objekten.
Das hier behandelte System läßt sich in
vier Ampelkomplexe einteilen. Zu solchem Komplex gehören
hier immer die Verkehrs- und Abbiegerampeln einer
Himmelsrichtung und die aus dieser jeweiligen Richtung kommend
rechts gelegenen Fußgängerampeln in beide Richtungen.
Jeder einzelne von ihnen wird in einer eigenen Spezialisierung
der Klasse KomplexPanel
implementiert. Diese erhalten die Namen SuedKomplex
, OstKomplex
, NordKomplex
und WestKomplex
. Jeder
dieser Komplexe erhält seine eigene Bildschirmdarstellung und
überlädt die Methode schalten(),
in der der Schaltalgorithmus für den jeweiligen
Komplex enthalten ist. Sie startet in bestimmter Reihenfolge und
in bestimmten Abständen die verschiedenen Ampeln. Dann muß sie
die Kontrollmethode des Ampelkomplexes aufrufen, damit sie erst
dann zurückkehrt, wenn alle ihre Ampeln wieder auf rot
geschaltet haben.
Das Ampelfenster, in der Klasse AmpelFrame
gekapselt, konstruiert die vier Komplexe und läßt sie in einer
Endlosschleife nacheinander schalten. Es muß eine Methode aus
dem AWT überladen, damit es sich beim Drücken der
schließen-Taste auch schließt.
Diese beiden Klassen enthalten jeweils eine Methode, um ein neues Ampelfenster zu starten. Die Applikation ist zur Verwendung mit einem Interpreter wie Java oder JView gedacht, das Applet zur Verwendung über eine HTML-Seite in einem Browser.
Die Klassen java.awt.Label und java.awt.TextField
werden in zwei Klassen ampel.steuerung.UeberschriftLabel
und ampel.steuerung.NumberTextField
erweitert. Erstere um Überschriften am Bildschirm
darzustellen, zweitere, da ein Textfeld gebraucht wird, das
kontrolliert, ob in es eingegebener Text als zu interpretieren
ist, und falls ja ob es auch eine gegebene Größe nicht
überschreitet.
Nun folgt eine eingehendere Betrachtung der Klassen, die für das Verkehrsleitsystem geschrieben wurden und ihrer speziellen Attribute und Methoden, wobei aus praktischen Gründen die Konstruktoren zu den Methoden gerechnet werden.
Alle Klassen in dem Paket ampel.steuerung
bis
auf AmpelApplikation
und AmpelApplet
sind nicht als öffentlich (public
) deklariert,
d.h. daß auf sie nur innerhalb des Paketes zugegriffen werden
kann. Dies liegt daran, daß sie nicht für Verwendung in anderen
Ampelanlagen oder -systemen entworfen wurden. Einige Klassen
könnten jedoch für andere System verwendet werden, bei Bedarf
müßte man jedoch ein neues Paket zusammenstellen, so daß es
angebracht ist auch sie hier nicht als öffentlich zu
deklarieren. Die Klassen AmpelApplikation
und AmpelApplet
sind als öffentlich deklariert, damit sie von
Interpretern bzw. Browsern ausgeführt werden können.
Methoden sind im allgemeinen nur aus
dem Paket erreichbar. Sie sind genau dann als öffentlich
deklariert, wenn sie entweder von außerhalb des Paketes
erreichbar sein müssen (wie z.B. die main()
-Methode der
Klasse AmpelApplikation
) oder wenn sie Methoden von Superklassen
überschreiben (wie z.B. die Methode paint()
der Klasse Ampel
). Methoden,
die als geschützt (protected
) deklariert wurden sind dies, wenn auch Subklassen
auf sie zugreifen sollen. Methoden, auf die nur aus ihrer Klasse
aus zugegriffen werden können soll, sind als privat (private
) deklariert.
Klassenvariablen sind meist als privat deklariert, da auf sie i.a. nur aus ihrer Klasse zugegriffen werden soll. Wenn auf sie auch von Subklassen zugegriffen werden soll, sind sie als geschützt deklariert.
Auf Konstanten, die mit dem Paket eingeführt wurden, kann von überall aus dem Paket zugegriffen werden, nicht aber von außerhalb.
ampel.steuerung.Ampellicht
Dies ist die abstrakte Oberklasse für Ampellichter, die sich dadurch auszeichnen, daß sie eine Farbe haben und ein- und ausgeschaltet werden können. Ein Ampellicht muß sein Erscheinungsbild erst durch erweiternde Klassen definiert bekommen.
Das Ampellicht ist von java.awt.Canvas
abgeleitet, da es dadurch leicht in die von java.awt.Panel
abgeleitete Ampel eingebettet werden kann.
ROT
, GELB
und GRUEN
Repräsentieren die Möglichkeiten, die man hat. Der Konstruktor sollte eine von ihnen übergeben bekommen.
Sie enthalten die echten Farbwerte, die ein Ampellicht in den verschiedenen Situationen annehmen kann, nämlich rot, gelb und grün in jeweils hell und dunkel.
hell
und dunkel
Ihnen wird die Farbe zugewiesen, die das spezielle Ampellicht jeweils hat, wenn es ein- bzw. ausgeschaltet ist.
Der Konstruktor bekommt zwei Argumente übergeben, eine Ganzzahl, die die Farbe repräsentiert, und ein Bool'scher Wert, der besagt, ob das Ampellicht am Anfang ein- oder ausgeschaltet sein soll.
Die Hintergrundfarbe der Ampel wird auf schwarz gesetzt, die Farben hell und dunkel auf den jeweils geforderten Wert. Dann wird je nach Bool'schem Wert das Licht ein- oder ausgeschaltet.
einschalten()
und ausschalten()
Mit ihrer Hilfe wird das jeweilige Ampellicht ein- bzw. ausgeschaltet, indem sein Vordergrund auf die jeweilige helle oder dunkle Farbe gesetzt und die Komponente neu gezeichnet wird.
Der Rumpf dieser Methoden ist völlig gleich, das liegt daran, das mit ihrer Hilfe die Größe einer AWT-Komponente festgelegt werden kann, ein Ampellicht aber nur eine bestimmte Größe haben kann.
paint()
Auch dies ist eine Methode aus dem AWT. Erweiternde Klassen müssen sie implementieren, damit das Licht ein Erscheinungsbild bekommt.
ampel.steuerung.AmpelKreis
Der Ampelkreis stellt eine Erweiterung des Ampellichtes um ein Erscheinungsbild dar. Es erscheint hier als Kreis.
Der Konstruktor ruft lediglich mit den ihm übergebenen Argumenten seinen Parentkonstruktor auf.
paint()
Diese Methode zeichnet auf dem schwarzen Hintergrund einen gefüllten Kreis in der aktuellen Vordergrundfarbe.
ampel.steuerung.AmpelPfeil
Der Ampelpfeil erweitert das Ampellicht um eine grafische Darstellung.
Er gibt die Argumente, mit denen er aufgerufen wurde an seinen Elternkonstruktor weiter.
paint()
Diese Methode zeichnet auf dem schwarzen Hintergrund einen Pfeil in der aktuellen Vordergrundfarbe.
ampel.steuerung.Ampel
Die Ampel stammt von java.awt.Panel
ab
und implementiert die Schnittstelle java.lang.Runnable
,
sie enthält die Anzeige und die Methoden, die den Ablauf einer
Ampelphase steuern. Sie ist nebenläufig, d.h. kann mit anderen
Ampeln ihrer Threadgruppe quasi gleichzeitig schalten. Sie ist
als abstrakt deklariert, da Subklassen den Typ der Ampellichter
spezifizieren müssen.
GELB_ZEIT
Sie speichert den Wert der Zeitspanne in Millisekunden, in der deutsche Ampeln auf gelb stehen müssen.
rot
, gelb
, gruen
Sie zeigen den Zustand der Ampel am Bildschirm an. Ihre Farbe muß nicht unbedingt ihrem Namen entsprechen.
time
Es zeigt die Länge des Intervalls, das die Ampel auf grün verbringt an. Es kann während des Ablaufs editiert werden, d.h. die Zeit auf grün kann online verändert werden.
thread
und die Threadgruppe tg
Der Thread ist für ein paralleles Arbeiten
mit anderen Ampeln notwendig, tg
enthält eine Referenz auf die Threadgruppe des
Komplexes, zu dem die jeweilige Ampel gehört. Der Thread ist
ebenso wie die Threads der Ampeln, mit denen diese parallel
schaltet Mitglied in dieser Threadgruppe.
Der Konstruktor bekommt zwei Argumente übergeben, die Länge des Intervalls, in dem die Ampel zunächst auf grün steht, und die Threadgruppe, in der der Kontrollfluß der jeweiligen Ampel Mitglied ist. Diese Gruppe wird gespeichert.
Dann wird dem Layout das Nummerntextfeld mit der ersten "Grünzeit" hinzugefügt und angezeigt.
run()
Sie beschreibt eine Ampelphase: von rot
wird zunächst auf rot-gelb geschaltet, dann wird drei Sekunden
gewartet, dann auf grün geschaltet usw. Schließlich wird stop()
aufgerufen.
start()
und stop()
Die Methode start() erzeugt einen neuen
Thread und startet ihn, der wiederum die run()
-Methode der
Ampel aufruft.
Die stop()
-Methode stoppt den Kontrollfluß und setzt die
Referenz der Ampel auf null.
minimumSize()
und preferredSize()
Der Rumpf dieser Methoden ist völlig gleich, das liegt daran, das mit ihrer Hilfe die Größe einer AWT-Komponente festgelegt werden kann, eine Ampel aber nur eine bestimmte Größe haben kann.
ampel.steuerung.VerkehrsAmpel
Die Verkehrsampel ist eine Erweiterung der Ampel, sie besteht aus drei Ampelkreisen.
Er ruft den Elternkonstruktor mit den übergebenen Argumenten auf und fügt je einen roten, grünen und gelben Ampelkreis hinzu und weist sie den elterlichen Ampellichtern zu.
Die Verkehrsampel ist zunächst auf rot geschaltet.
ampel.steuerung.AbbiegerAmpel
Die Abbiegerampel ist eine Erweiterung der Ampel, sie besteht aus drei Ampelpfeilen.
Er ruft den Elternkonstruktor mit den übergebenen Argumenten auf und fügt je einen roten, grünen und gelben Ampelpfeil hinzu und weist sie den elterlichen Ampellichtern zu.
Die Abbiegerampel ist zunächst auf rot geschaltet.
ampel.steuerung.FussgaengerAmpel
Die Fußgängerampel ist eine Erweiterung der Ampel, sie besteht aus drei Ampelkreisen. Außerdem hat sie eine etwas andere Ampelphase.
Er ruft den Elternkonstruktor mit den übergebenen Argumenten auf und fügt zwei(!) rote und einen grünen Ampelkreis hinzu und weist sie den elterlichen Ampellichtern zu.
Die Fußgängerampel ist zunächst auf rot geschaltet.
run()
Hier wird nur von rot auf grün geschaltet, gewartet, wieder zurückgeschaltet und der Thread gestoppt.
ampel.steuerung.AmpelKomplex
Der Ampelkomplex ist eine abstrakte Superklasse für Komplexe, die Teil eines Systems sind. Er stellt hierfür eine Reihe von Methoden zur Verfügung. Jeder Komplex soll seine eigene erweiternde Klasse erhalten, für die diese Klasse Grundstock ist.
tg
In dieser Threadgruppe sind die Threads aller Ampeln Mitglied, die zu diesem Komplex gehören.
Der Konstruktor bekommt einen String (seinen Namen) und die Threadgruppe des Systems übergeben. Er erzeugt eine eigene Threadgruppe, die seinen Namen trägt und Mitglied in der übergebenen Gruppe ist.
beenden()
Sie kontrolliert in einer Endlosschleife, ob noch Threads in der Threadgruppe tg aktiv sind. Gibt es irgendwann keine aktiven Threads mehr, kehrt sie zurück. Der Sinn dieser Methode ist es zu warten, bis alle zum Komplex gehörigen Ampeln wieder auf rot geschaltet haben, damit andere Komplexe erst dann gestartet werden.
warten()
Diese Methode wartet die in Millisekunden übergebene Zeit ab und kehrt dann zurück.
schalten()
Diese Methode soll in Erweiterungen des Ampelkomplexes den eigentlichen Schaltalgorithmus enthalten.
ampel.steuerung.NordKomplex
Diese und die folgenden Klassen sind Erweiterungen des Ampelkomplexes. Sie enthalten jeweils eine bestimmte Anzahl von Ampeln aller Arten, sie zeigen diese an und koordinieren ihr Schalten.
Er bekommt eine Threadgruppe übergeben, die er an seinen Elternkonstruktor weitergibt. Dann erzeugt er die Ampeln und das Layout für sie.
schalten()
Sie enthält die Reihenfolge in welcher die Mitgliedsampeln gestartet werden sollen. In Kombination mit den im Konstruktor übergebenen Grünzeiten für die Ampeln läßt sich so der gesamte Schaltalgorithmus eines Komplexes von einer Klasse aus steuere.
Hier ist sie so eingestellt, daß zu nächst die Fußgängerampeln, dann die Abbiegerampeln und dann die Verkehrsampeln mit jeweils einer Sekunde Unterbrechung gestartet werden.
ampel.steuerung.WestKomplex
Sie unterscheidet sich nur in Zahl und Reihenfolge des Startes der Ampeln vom Nordkomplex.
schalten()
Sie startet zuerst die Abbiegerampel, dann die Fußgänger-, dann die Verkehrsampeln in einem Intervall von einer Sekunde.
ampel.steuerung.SuedKomplex
Sie unterscheidet sich nur in Zahl und Reihenfolge des Startes der Ampeln vom Nordkomplex.
schalten()
Sie startet zuerst die Fußgänger-, dann die Abbieger- und Verkehrsampeln in einem Intervall von zwei Sekunden.
ampel.steuerung.OstKomplex
Sie unterscheidet sich nur in Zahl und Reihenfolge des Startes der Ampeln vom Nordkomplex.
schalten()
Sie startet zuerst die Abbieger- und Verkehrsampeln, dann die Fußgängerampeln mit einem Abstand von einer Sekunde.
ampel.steuerung.AmpelFrame
Das Ampelfenster enthält die verschiedenen Komplexe und zeigt sie an. Es läßt sie der Reihe nach schalten. Es ist in der Größe nicht veränderbar, damit immer alle Ampeln gleichzeitig überschaubar sind. Es kann aber, wenn es im Hintergrund laufen soll minimiert werden.
nord
, ost
, sued
, west
Sie enthalten die vier Komplexe des Systems.
tg
Dies ist die Systemthreadgruppe, alle Komplexthreadgruppen sind in ihr Mitglied.
Er erzeugt das Layout für das Fenster und die vier Komplexe, dann läßt er sie in einer Endlosschleife abwechselnd schalten.
handleEvent()
Diese Methode wird überladen, damit das Fenster beim Klick auf die Schaltfläche "Schließen" auch schließt, sie behandelt nur diesen einen Event.
ampel.Steuerung.AmpelApplikation
Sie ist zur Verwendung des Programmes mit einem Java-Interpreter gedacht, er muß hier unter Win32 gestartet werden, damit eine Anbindung an den Hardwareteil möglich ist.
main()
Sie erzeugt ein neues Ampelfenster. Eventuelle Argumente, die beim Start des Interpreters eingeben wurden, werden ignoriert.
ampel.Steuerung.AmpelApplet
Sie wurde entworfen, damit das Programm
auch in einem Java-fähigen Browser ablaufen kann. Sie ist eine
Erweiterung der Klasse java.applet.Applet
.
init()
Sie überschreibt die gleichnamige Methode der Superklasse, sie wird automatisch beim Start des Applets aufgerufen. Sie erzeugt dann ein neues Ampelfenster.
ampel.Steuerung.UeberschriftLabel
Das Überschriftlabel ist eine Subklasse von java.awt.Label, es stellt den Text in einer großen, fetten Schrift dar.
Er erzeugt das Layout für die Überschrift und zeigt sie an.
ampel.Steuerung.NumberTextField
Es ist eine Erweiterung von java.awt.TextField
und stellt nur Zahlen, keine Buchstaben dar, wenn etwas in es
eingegeben wird, kontrolliert es, ob es eine Zahl ist und ob es
ein gesetztes Maximum nicht überschreitet.
maximum
Sie enthält das Maximum, das die angezeigte Zahl haben darf.
alterText
Sie speichert die letzte korrekte Zahl.
Er bekommt den Text, den er anzeigen soll, die Anzahl der Spalten und das Maximum, das die angezeigte Zahl haben darf übergeben. Der Text wird nur dann angezeigt, wenn er als Zahl interpretierbar und nicht zu groß ist.
action()
Sie wird überladen, damit kontrolliert werden kann ob ein String, der in das Feld eingegeben wurde korrekt ist.
setText()
Sie wird überladen, damit kontrolliert wird, ob der angegebene String nicht zu groß und eine Zahl ist.
richtigeGroesse()
Sie gibt genau dann true
zurück, wenn
der ihr übergeben String als Zahl interpretierbar ist und
nicht größer als das Maximum ist.
This page hosted by
Get your own
free homepage!