Benutzer-Werkzeuge

Webseiten-Werkzeuge


ampel

Showcase: Ampel

Im Folgenden ist die Implementierung einer Verkehrsampel (kurz: Ampel) aufgeführt. Es zeigt die Umsetzung der fünften konzeptuellen Anforderung des GeoFaSC-Konzeptes. Die Kernlösung umfasst die zwei Klassen Lamp und TrafficLight.

Klasse Lamp

Die Klasse Lamp repräsentiert Lampen (als gefüllte Kreise, Lamp ist aus Circle abgeleitet), die an- und ausgeschaltet werden können. Beim Erzeugen einer Lampe werden ihre Position bezüglich eines umgebenden Containers (hier ein TrafficLight-Objekt), dem diese hinzugefügt werden kann, ihre Größe sowie An-Farbe (die Aus-Farbe ist für alle Lampen gleich) und ihr initialer Zustand festgelegt.

Lamp.java
import java.awt.Color;
import geofasc.swing.Circle;
 
public class Lamp extends Circle {
 
  private static Color OFF_COLOR = Color.DARK_GRAY;
  private Color mOnColor;
  private boolean mIsOn;
 
  public Lamp(int x, int y, int radius, Color onColor, boolean isOn) {
    super(x, y, radius);
    mOnColor = onColor;
    super.setFigureFilled(true);
    setOn(isOn);
  }
 
  public boolean isOn() { 
    return mIsOn;
  }
 
  public void setOn(boolean on) {
    mIsOn = on;
    if (mIsOn)
      super.setFigureFillColor(mOnColor);
    else
      super.setFigureFillColor(OFF_COLOR);
  }
} // class Lamp

Klasse TrafficLight

Die Klasse TrafficLight ist aus Rectangle abgeleitet und repräsentiert namentlich Ampeln mit ihren verschiedenen Phasen Rot, Rot-Gelb, Gelb und Grün. Der Konstruktor von TrafficLight verdeutlicht den Komponentenansatz von GeoFaSC. Dort werden die drei Lampen einer Ampel erzeugt und dieser einfach hinzugefügt. Die Positionen der Lampen sind relativ zur linken oberen Ecke des rechteckigen Ampelgehäuses. Eine Ampel wird damit zur komplexen Figur, dennoch kann auf dieselbe und ihre Lampen objektorientiert zugegriffen werden (siehe setStatus-Methode).

TrafficLight.java
import java.awt.Color;
import geofasc.swing.*;
 
public class TrafficLight extends Rectangle {
 
  private Lamp mRedLamp, mYellowLamp, mGreenLamp;
  // 1 = RED, 2 = RED_YELLOW, 3 = GREEN, 4 = YELLOW
  private int mStatus;
 
  public TrafficLight() {     
    super(70, 190);     
    super.setFigureFillColor(Color.BLACK);
    super.setFigureFilled(true);
    mStatus = 1;
    mRedLamp     = new Lamp(10, 10, 50, Color.RED, true);
    mYellowLamp  = new Lamp(10, 70, 50, Color.YELLOW, false);
    mGreenLamp   = new Lamp(10, 130, 50, Color.GREEN, false);
    super.add(mRedLamp);     
    super.add(mYellowLamp);
    super.add(mGreenLamp);
  }
 
  public void setNextStatus() {
    setStatus(mStatus + 1);
  }
 
  public void setStatus(int status) {
    if ((mStatus = status) > 4)
      mStatus = 1;
 
    switch (mStatus) {
      case 1: // RED     
        mRedLamp.setOn(true);
        mYellowLamp.setOn(false);
        mGreenLamp.setOn(false);
        break;       
      case 2: // RED_YELLOW
        mRedLamp.setOn(true);
        mYellowLamp.setOn(true);
        mGreenLamp.setOn(false);
        break;  
      case 3:
        mRedLamp.setOn(false);
        mYellowLamp.setOn(false);
        mGreenLamp.setOn(true);
        break;
      case 4:
        mRedLamp.setOn(false);
        mYellowLamp.setOn(true);
        mGreenLamp.setOn(false);
        break;  
    }
  }
} // class TrafficLight

Zur Visualisierung einer Ampel kann diese einem entsprechenden Container hinzugefügt werden. Aufgrund der Kompatibilität zu Swing ist man dabei nicht auf eigens implementierte Container angewiesen.

TrafficLight tLight = new TrafficLight();
JLayeredPane canvas = new JLayeredPane(); 
JFrame frame = new JFrame("Traffic light"); 
... 
frame.setContentPane(canvas); 
frame.setVisible(true);
canvas.add(tLight);

Grafische Änderungen der Ampel können, wie folgt programmiert, durchgeführt werden. Die Figur und ihre inkludierten Figuren werden automatisch und positionsgerecht neu gezeichnet. Auch stehen übliche Swing Eigenschaften, wie z.B. das Setzen eines Tooltips, zur Verfügung.

tLight.moveFigureLocationBy(40, 30);
tLight.setNextState(); 
tLight.setToolTipText("I'm a traffic light"); 
tLight.setNextState(); 
tLight.moveFigureLocationXBy(-20); 
...
ampel.txt · Zuletzt geändert: 2014/02/27 17:19 von admin