Timer (2) Eine Fenster-Anwendung mit Timer

Wir bauen uns eine Ampel

Klicken Sie auf die Schaltfläche "Frame", um den Programmrahmen für eine Anwendung anzulegen: Geben Sie Ihrem Projekt den Namen "Ampel" und speichern Sie es in einem eigenen Ordner.  .

 

Sehen Sie sich dann den Code an:
Der Javaeditor erzeugt Importanweisungen für java.awt.* und java.awt.event.*.
sodann erzeugt er die Klasse public class Ampel extends Frame
mit der Konstruktor-Methode public Ampel(String title)
und der Methode public static void main(String[] args),
die durch Aufruf des Konstruktors ein Objekt der Klasse "Ampel" produziert.
Es enthält ein Fenster der Größe 300x300 Pixel und darin ein Panel, auf dessen Grafik-Oberfläche man zeichnen kann.

Diese Klasse wollen wir nun mit Funktionalität versehen.

Als erstes benötigen wir einen Timer zur Steuerung unserer Ampel. Wir finden ihn in der Utilities-Bibliothek.
Fügen Sie bei den Importanweisungen hinzu: import java.util.*;

Im Abschnitt "Attribute" erzeugen wir drei Variablen:
Timer ticker = new Timer();
Graphics bild; //*
int zustand = 0;

Die erste übergibt unserem Objekt die Adresse eines Timers namens ticker,
die zweite dient zur Speicherung der Adresse des Grafikkontexts bild des Panels in unserem Fenster,
die dritte merkt sich zwischen zwei Uhrtickern den Zustand unserer Ampel.

Der Konstruktor baut das Fenster auf, fügt zusätzliche Komponeneten ein (bei uns nicht) und macht es sichtbar.
Er endet bisher mit der Anweisung setVisible=true; Hinter diese Anweisung (aber vor die abschließende Klammer des Konstruktors) fügen wir einige zusätzliche Anweisungen ein, die nur einmal beim Programmstart ausgeführt werden:


    try {Thread.sleep(500);}          // gibt dem Formaufbau etwas zusätzliche Zeit
    catch (Exception e) {};  

    bild = cp.getGraphics();          // meldet der Variablen bild die Adresse der Grafik des Panels

    bild.setColor(Color.black);       // zeichnet ein schwarzes Rechteck als Ampel
    bild.fillRect(120,10,60,220);  
    bild.setColor(Color.white);       // und drei weiße Kreise, die Umrisse der Lampen
    bild.drawOval(130,20,40,40);
    bild.drawOval(130,80,40,40);
    bild.drawOval(130,140,40,40);

    ticker.scheduleAtFixedRate(tJob, 0, 1000);  // startet den Auftrag tJob des Timers


Der Timerauftrag wird alle 1000-Millisekunden ausgeführt. Er ist im Abschnitt zwischen "Anfang Methoden" und "Ende Methoden" einzufügen und lautet wie folgt:


  TimerTask tJob = new TimerTask() {
    public void run() {
      if (zustand==0) {
        bild.setColor(Color.black);
        bild.fillOval(130,80,40,40);
        zustand=1;
     } else {
        bild.setColor(Color.yellow);
        bild.fillOval(130,80,40,40);
        zustand=0;
      }
    }
  };

Aufgaben:

  1. Blinken kann sie ja schon, unsere Ampel. Programmieren Sie eine richtige Verkehrsampel.
  2. Wie wär's mit einer Uhr? 
    Dies ist eine Aufgabe für Fortgeschrittene. Die aktuelle Zeit liefert uns die Klasse Date:
    Date d; d = new Date; h = d.getHour(); m = d.getMinutes(); s = d.getSeonds();
    Unterschiedliche Strichstärken für die Zeiger sind nicht mit der Klasse Graphics, sondern nur mit Graphics2D möglich.