JavaSwing

ftComputing : Programme für die fischertechnik-Interfaces und -konstruktionskästen
  
ftComputing.de
Home
Back
Sitemap
Index
Links
Impressum
Mail

 

Beispiel : die Ampel mit Swing

Ampel mit Swing

Wieder eine einfache Verkehrsampel mit den Lampen Rot = 3, Gelb = 2 und Grün = 1, sowie dem Taster E1. 

Das Programm wurde mit dem JBuilder5 und SDK1.3 erstellt (es dürfte aber auch in anderer Umgebung laufen, da nur einfache Elemente genutzt wurden).
Es besteht aus dem automatisch generierten Startprogramm Haupt.java und dem JFrame Form.java mit der eigentlichen Anwendung. Es nutzt das Package ftcomputing.JavaFish und FishThread. Hier ein paar interessante Details zu Form.java (die komplette Quelle ist in JavaFish.ZIP enthalten :

Struktur

Deklaration eines Objektes JavaFish ft = new JavaFish(); und eines Feldes Ampel ampel; auf Klassenebene.

Start des Ampelprogramms über den Button START (cmdAction) durch Starten des Threads ampel.

Beenden des Threads ampel über den ENDE / HALT Button (cmdEnde) oder durch  Escape-Taste / Taster E1.

Thread Ampel ampel mit dem eigentlichen Ampel-Programm. Die Verlegung der Anwendung in einen Thread (Ablauf in cmdAction ist auch möglich) wurde gewählt, um die Reaktionsfähigkeit der Anwenderoberfläche zu erhalten. Hier : der HALT Button reagiert aufs Wort und es kann angezeigt werden.

Der Button START 

void cmdAction_actionPerformed(ActionEvent e) {
String Portname;
int res;

ft.setAnalogScan(true);
Portname = txtPortname.getText().toUpperCase();
txtPortname.setText(Portname);
if(ft.openInterface(Portname) == ft.FT_ERROR) {
lblStatus.setText("Is Nich");
return;
};

ampel = new Ampel(ft);
ampel.start();
cmdAction.setEnabled(false);
cmdEnde.setText("HALT");
cmdEnde.requestFocus();
}

  1. ft.openInterface : herstellen der Verbindung zum Interface.
  2. ampel = new Ampel(ft); ... : Anlegen und Starten des Threads ampel
  3. cmdAction.setEnabled(false) : Sperren von cmdAction für weitere Betätigung.

Der Button ENDE

void cmdEnde_actionPerformed(ActionEvent e) {
if(cmdEnde.getText() == "ENDE") System.exit(0);
else {
ft.emergencyHalt = true;
try{ampel.join();} catch(InterruptedException ex){}
}}

  1. if(cmdEnde ... : Toggle. Wenn der Ende Button die Beschriftung "ENDE" beendet er das Programm, sonst leitet er das Thread-Ende ein.
  2. ft.emergencyHalt : Feld in JavaFish zur Steuerung eine Abbruchwunsches.
  3. ampel.join() : Warten auf das Ende des Threads ampel.

Der Thread ampel

public class Ampel extends FishThread {
public Ampel(JavaFish ft){
super(ft);
}
public void run(){
int Runde = 0;
do {
Runde++;
lblStatus.setText("Runde : " + Runde);
lblAnalog.setText("EX : " + ft.getAnalog(0));
ft.setMotor(1, ft.ON);
ft.pause(1000);
ft.setMotor(1, ft.OFF);
ft.setMotor(2, ft.ON);
ft.pause(500);
ft.setMotor(2,ft.OFF);
ft.setMotor(3, ft.ON);
ft.pause(1234);
ft.setMotor(2, ft.ON);
ft.pause(500);
ft.setMotor(3, ft.OFF);
ft.setMotor(2, ft.OFF);
} while (!ft.finish(1));
ft.clearMotors();
ft.closeInterface();
lblStatus.setText("Finito");
cmdEnde.setText("ENDE");
cmdAction.setEnabled(true);
}}

  1. class Ampel ist eine Member Klasse, hat also Zugriff auf die Umgebung, sprich die Anzeige JLabels
  2. run(), die eigentliche Thread Routine zeigt einen Rundenzähler und den Wert von EX an bevor die Ampelschalterei beginnt.
  3. ft.pause() sorgt für die Abbrechbarkeit des Threads : unterbricht den Schlaf des Threads durch regelmäßige Abfrage von ft.emergencyHalt und der Escape-Taste.
  4. ft.finish(1) tut gleiches und wartet außerdem auf E1 = true.
  5. Die Reaktionsfähigkeit der Anwenderoberfläche ist durch den Thread-Mechanismus gewährleistet und zusätzlich noch durch die Schlafpausen in der die Prozesszeit abgegeben wird. Ohne diese Pausen wäre ein Thread.yield() in der Schleife sinnvoll um zusätzlich Prozesszeit abzugeben.

Stanze 51 663

Ein weiteres Beispiel Programm auf der Seite Stanze 51 663. Die Klasse JavaFish wurde dazu leicht erweitert (Das Exception Handling fehlt aber immernoch).