zurück zum Inhaltsverzeichnis


Steuerung und grafische Darstellung eines Verkehrsleitsystems am PC mit Java

Facharbeit Informatik

 

Kurzfassung

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.

 


Inhaltsverzeichnis


Vorüberlegungen

Anforderungsdefinition

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.

 

Standardisierung

Die hier entwickelte Software basiert auf und verwendet die von Sun Microsystems zur Verfügung gestellten Java-Entwicklungsumgebung JDK Version 1.0.

 


 

Objektorientierte Analyse

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.

 


 

Objektorientiertes Design

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.

Ampellichter

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.

 

Ampeln

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.

 

Komplexe

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.

 

Spezialisierung

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.

 

Spezielle Komplexe

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.

 

Ampelfenster

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.

 

Ampelapplikation und -applet

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.

 

Hilfsklassen

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.

 


 

Objektorientierte Programmierung und Implementation

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.

Zugriffsmodifizierer

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.

 

Die Klasse 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.

Die Konstanten ROT, GELB und GRUEN

Repräsentieren die Möglichkeiten, die man hat. Der Konstruktor sollte eine von ihnen übergeben bekommen.

Die Farbkonstanten

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.

Die Variablen hell und dunkel

Ihnen wird die Farbe zugewiesen, die das spezielle Ampellicht jeweils hat, wenn es ein- bzw. ausgeschaltet ist.

Der Konstruktor

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.

Die Methoden 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.

Die Methoden 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, ein Ampellicht aber nur eine bestimmte Größe haben kann.

Die Methode paint()

Auch dies ist eine Methode aus dem AWT. Erweiternde Klassen müssen sie implementieren, damit das Licht ein Erscheinungsbild bekommt.

 

Die Klasse ampel.steuerung.AmpelKreis

Der Ampelkreis stellt eine Erweiterung des Ampellichtes um ein Erscheinungsbild dar. Es erscheint hier als Kreis.

Der Konstruktor

Der Konstruktor ruft lediglich mit den ihm übergebenen Argumenten seinen Parentkonstruktor auf.

Die Methode paint()

Diese Methode zeichnet auf dem schwarzen Hintergrund einen gefüllten Kreis in der aktuellen Vordergrundfarbe.

 

Die Klasse ampel.steuerung.AmpelPfeil

Der Ampelpfeil erweitert das Ampellicht um eine grafische Darstellung.

Der Konstruktor

Er gibt die Argumente, mit denen er aufgerufen wurde an seinen Elternkonstruktor weiter.

Die Methode paint()

Diese Methode zeichnet auf dem schwarzen Hintergrund einen Pfeil in der aktuellen Vordergrundfarbe.

 

Die Klasse 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.

Die Konstante GELB_ZEIT

Sie speichert den Wert der Zeitspanne in Millisekunden, in der deutsche Ampeln auf gelb stehen müssen.

Die drei Ampellichter rot, gelb, gruen

Sie zeigen den Zustand der Ampel am Bildschirm an. Ihre Farbe muß nicht unbedingt ihrem Namen entsprechen.

Das Nummerntextfeld 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.

Der Kontrollfluß 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

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.

Die Methode 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.

Die Methoden 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.

Die Methoden 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.

 

Die Klasse ampel.steuerung.VerkehrsAmpel

Die Verkehrsampel ist eine Erweiterung der Ampel, sie besteht aus drei Ampelkreisen.

Der Konstruktor

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.

 

Die Klasse ampel.steuerung.AbbiegerAmpel

Die Abbiegerampel ist eine Erweiterung der Ampel, sie besteht aus drei Ampelpfeilen.

Der Konstruktor

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.

 

Die Klasse 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.

Der Konstruktor

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.

Die Methode run()

Hier wird nur von rot auf grün geschaltet, gewartet, wieder zurückgeschaltet und der Thread gestoppt.

 

Die Klasse 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.

Die Threadgruppe tg

In dieser Threadgruppe sind die Threads aller Ampeln Mitglied, die zu diesem Komplex gehören.

Der Konstruktor

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.

Die Methode 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.

Die Methode warten()

Diese Methode wartet die in Millisekunden übergebene Zeit ab und kehrt dann zurück.

Die Methode schalten()

Diese Methode soll in Erweiterungen des Ampelkomplexes den eigentlichen Schaltalgorithmus enthalten.

 

Die Klasse 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.

Der Konstruktor

Er bekommt eine Threadgruppe übergeben, die er an seinen Elternkonstruktor weitergibt. Dann erzeugt er die Ampeln und das Layout für sie.

Die Methode 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.

 

Die Klasse ampel.steuerung.WestKomplex

Sie unterscheidet sich nur in Zahl und Reihenfolge des Startes der Ampeln vom Nordkomplex.

Die Methode schalten()

Sie startet zuerst die Abbiegerampel, dann die Fußgänger-, dann die Verkehrsampeln in einem Intervall von einer Sekunde.

 

Die Klasse ampel.steuerung.SuedKomplex

Sie unterscheidet sich nur in Zahl und Reihenfolge des Startes der Ampeln vom Nordkomplex.

Die Methode schalten()

Sie startet zuerst die Fußgänger-, dann die Abbieger- und Verkehrsampeln in einem Intervall von zwei Sekunden.

 

Die Klasse ampel.steuerung.OstKomplex

Sie unterscheidet sich nur in Zahl und Reihenfolge des Startes der Ampeln vom Nordkomplex.

Die Methode schalten()

Sie startet zuerst die Abbieger- und Verkehrsampeln, dann die Fußgängerampeln mit einem Abstand von einer Sekunde.

 

Die Klasse 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.

Die Ampelkomplexe nord, ost, sued, west

Sie enthalten die vier Komplexe des Systems.

Die Threadgruppe tg

Dies ist die Systemthreadgruppe, alle Komplexthreadgruppen sind in ihr Mitglied.

Der Konstruktor

Er erzeugt das Layout für das Fenster und die vier Komplexe, dann läßt er sie in einer Endlosschleife abwechselnd schalten.

Die Methode 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.

 

Die Klasse 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.

Die Methode main()

Sie erzeugt ein neues Ampelfenster. Eventuelle Argumente, die beim Start des Interpreters eingeben wurden, werden ignoriert.

 

Die Klasse 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.

Die Methode init()

Sie überschreibt die gleichnamige Methode der Superklasse, sie wird automatisch beim Start des Applets aufgerufen. Sie erzeugt dann ein neues Ampelfenster.

 

Die Klasse ampel.Steuerung.UeberschriftLabel

Das Überschriftlabel ist eine Subklasse von java.awt.Label, es stellt den Text in einer großen, fetten Schrift dar.

Der Konstruktor

Er erzeugt das Layout für die Überschrift und zeigt sie an.

 

Die Klasse 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.

Die Variable maximum

Sie enthält das Maximum, das die angezeigte Zahl haben darf.

Die Variable alterText

Sie speichert die letzte korrekte Zahl.

Der Konstruktor

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.

Die Methode action()

Sie wird überladen, damit kontrolliert werden kann ob ein String, der in das Feld eingegeben wurde korrekt ist.

Die Methode setText()

Sie wird überladen, damit kontrolliert wird, ob der angegebene String nicht zu groß und eine Zahl ist.

Die Methode 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.

 


Literaturverzeichnis

 

zurück zum Kopf der Seite


1