Beispiel : die 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();
}
- ft.openInterface : herstellen der Verbindung zum
Interface.
- ampel = new Ampel(ft); ... : Anlegen und Starten
des Threads ampel
- 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){}
}}
- if(cmdEnde ... : Toggle. Wenn der Ende Button die Beschriftung
"ENDE" beendet er das Programm, sonst leitet er das Thread-Ende
ein.
- ft.emergencyHalt : Feld in JavaFish zur Steuerung eine Abbruchwunsches.
- 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);
}}
- class Ampel ist eine Member Klasse, hat also Zugriff auf die Umgebung,
sprich die Anzeige JLabels
- run(), die eigentliche Thread Routine zeigt einen Rundenzähler und den
Wert von EX an bevor die Ampelschalterei beginnt.
- 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.
- ft.finish(1) tut gleiches und wartet außerdem auf E1 = true.
- 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).
|