|
Java-Fenster
Erzeugung und Verwaltung eigener Fenster
Homepage von PS-Trainer - Entwicklung - Java - an PS-Trainer |
|
| Bisher haben sie nur mit einer Fläche gearbeitet: Mit dem Applet-Bereich innerhalb der gastgebenden Webseite. | Hier finden sie einige Anregungen, eigene Fenster zu erzeugen und mit den bekannten Elementen: zu bevölkern: Text, Grafik, Steuer-Elemente |
|
| Projekt Passwort-Prüfung:
Das Ziel dieses Projekts: Die "Rahmenhandlung": Ihr Fenster soll einen einfachen Passwort-Dialog abwickeln. Wenn das Passwort richtig eingegeben wurde, dann zeigen sie die Zielseite an, ansonsten die Fehlerseite. |
Dazu benötigen sie eine Reihe wichtiger Klassen und Methoden: Versuchen sie, möglichst klar strukturiert vorzugehen, d.h. immer nur einen kleinen (!) Schritt zu programmieren, auszutesten und zu dokumentieren. Dann erst folgen weitere Schritte. |
| Zur Vorbereitung des Projekts erzeugen sie 3 Webseiten: Eine Seite für ihr Applet, wie gewohnt, eine Zielseite ziel.htm, die sie anzeigen, wenn ihr Applet erfolgreich absolviert wurde, und eine Fehlerseite sorry.htm bei Fehlschlag. Testen sie diese Seiten, bevor sie versuchen, sie mit Hilfe des Applets zu laden ! Applet-Seite: Sie können natürlich weiterhin einen Bereich ihrer Webseite für das Applet reservieren - z.B. für Debug-Zwecke. Zuletzt werden sie den Applet-Bereich jedoch verschwinden lassen - sie verwenden jetzt ein eigenes Java-Fenster ! |
<applet code="eingabe.class" width="0"
height="0">
Alternativer HTML-Code, z.B. Hinweistext <br> </applet> |
| Das Basis-Applet: Für ein Fenster erzeugen sie ab jetzt eine eigene Klasse - wie für alle anderen grösseren und wichtigeren Objekte. Damit wird es einfacher und übersichtlicher, diese Objekte zu verwalten, zudem wird ihr Code besser transportabel. Sie haben es hier erstmals mit 2 Klassen zu tun, daher auch mit 2 Dateien. Ihr Applet (eingabe) importiert nicht nur die üblichen java-Klassen, sondern auch die eigene Klasse fenster . Mit Hilfe dieser weiter unten gezeigten Klasse deklarieren sie diesmal ihr Fenster entsprechend anders: Ihre eigene Klasse fenster enthält bereits die Klasse Frame, die sie weiterhin für das Fenster einsetzen. Methode init unterscheidet sich nur wenig: hier erzeugen sie das Fenster, und stellen allgemeine Parameter wie Grösse, Lage usw. ein. Spezielle Eigenschaften dieses Fensters werden von ihrer eigenen Fenster-Klasse verwaltet - damit erreichen sie eine übersichtliche Trennung. Ebenso wie im ersten Beispiel machen sie ihr Fenster mit start sichtbar und geben die Resourcen mit stop wieder an das Betriebssystem zurück. Hinweis: Beim Compilieren muss der Compiler neben den Java-Klassen auch ihre eigene Klasse fenster finden - das funktioniert (nur) bei richtiger Einstellung der Umgebungs-Variablen CLASSPATH. |
|
| Ihre eigene Fenster-Klasse: ist ganz ähnlich wie das erste einfache Beispiel aufgebaut. Der Import von java.applet fällt weg, der von java.awt bleibt. Ihr eigenes Fenster ist diesmal nicht von der Klasse Applet abgeleitet, sondern von Frame. Deklarieren sie alle Bestandteile ihres Fensters, hier: 2 Buttons und ein Textfeld. TextField ist ein einzeiliges Textfeld, Textarea ein mehrzeiliges. Die neue public Methode handleEvent (s.u.) behandelt Fenster-Ereignisse. Die bekannte Methode action ist der Handler für Ereignisse innerhalb ihres eigenen Fensters. Dann wird zunächst einmal das eigene Fenster eingestellt, so wie sie das von Applet-Fenstern gewohnt sind. Zuletzt werden die deklarierten Objekte erzeugt und wunschgemäss eingestellt. |
fenster.java
import java.awt.*;
public class fenster extends Frame { Button OKButton, NeinButton; TextField Passwortfeld; int i=0; // 3 Versuche public fenster() { // Event-handler public boolean handleEvent(...) { ... } public boolean action (...) { ... } public void PasswortPruefen(...) { ... } // Einstellung des eigenen Fensters setBackground(Color.white); setForeGround(Color.black); // Bestandteile des Fensters Label Ueberschrift=new Label ("Bitte Passwort eingeben",Label.CENTER); add(Ueberschrift); Passwortfeld=new TextField(20); add(Passwortfeld); OKButton=new Button("OK"); add(OKButton); OKButton.setSize (100,50); OKButton.setBackground(Color.lightGray); OKButton.setForeground(Color.black); NeinButton=new Button("Nein"); NeinButton.setBackground(Color.lightGray); NeinButton.setForeground(Color.black): } } |
| Fenster-Eregnisse: Hier wird die neue public Methode handleEvent eingeführt, mit der sie Fenster-Ereignisse behandeln. Methode action reagiert auf Ereignisse innerhalb ihres Fensters. Sie programmieren das Schliessen des Fensters. Da Methode dispose nun auf das eigene Fenster angewendet wird, braucht es nicht die Angabe, welches Fenster zu schliessen ist. Diese Methode erhält von Java das Event, wenn sie das Kästchen zum Fenster-schliessen anklicken. Wenn sie auch andere Fenster-Ereignisse behandeln wollen, dann geschieht das an dieser Stelle. In jedem Fall müssen sie aus dem Strom der von Java übergebenen Ereignisse jene herausfiltern (if...), die sie selbst behandeln - diese werden mit true (Rückgabe an runtime Java) quittiert. Andere Ereignisse: WINDOW_DEICONIFY (Icon->Window), WINDOW_DESTROY (schliessen), WINDOW_EXPOSE (darstellen), WINDOW_ICONIFY (Window->Icon), WINDOW_MOVED (bewegen), ... |
|
| Eigene Ereignisse: Die Methode action ist für Ereignisse innerhalb ihres Fensters verantwortlich. Hier wird auf 2 Button-Ereignisse reagiert: Button OK und Button Nein. Die Behandlung von Button OK wird in eine eigene Methode PasswortPruefen ausgelagert (s.u.). Bei Behandlung des Nein-Buttons wird versucht, eine eigene Fehler-Webseite zu laden. Gelingt das, wird die Seite angezeigt. Bei Fehlschlag wird im eigenen Fenster eine Fehlermeldung erzeugt. Webseite laden: Hier sehen sie das Laden einer Seite mit relativer Adresse (z.B. im gleichen Verzeichnis wie die aktuelle Seite). Dazu wird zuerst die CodeBase der aktuellen Seite ermittelt, dann relativ dazu die neue Seite (sorry.htm) adressiert. Mit Methode getAppletContext können sie die "Umgebung" ihres Applets = ihre Webseite ansprechen und ihr Anweisungen (showDocument) übermitteln: In diesem Fall die Anweisung, die Fehlerseite anzuzeigen. Hinweis: Bei absoluter Adressierung verkürzt sich die Anweisung auf URL seite=new URL("http://www.oocities.org/pstrainer/");
da sie dazu keine CodeBase brauchen. |
import java.net.*;
int i=0; // 3 Versuche public boolean action(Event evt,Object erg) { if(ev.target instanceof Button) { String Knopf=arg.toString(); if(Knopf.equals("OK")) { i++; PasswortPruefen(); } if(Knopf.equals("Nein")) { try { // Neue URL erzeugen URL appletseite=getCodeBase(); URL seite=new URL(appletseite,"sorry.htm"); // Die eigene Webseite ansprechen AppletContext dasApplet=getAppletContext(); dasApplet.showDocument(seite); } catch(MalformedURLException ex) { Graphics g=getGraphics(); g.drawString("Fehler beim Laden von "+ex,10,50); } } } return false; } |
| Passwort prüfen: In dieser Methode werden weitgehend bekannte Arbeitstechniken verwendet: Mit Methode getText wird der von AnwenderIn eingetragene Text eingeholt. Die nachfolgende Prüfung wird auf 3 Versuche (globale Variable i vorher definieren) beschränkt. Falls das richtige Passwort (hier prime) eingegeben wurde, wird die gewünschte Ziel-Webseite angezeigt. In den übrigen möglichen Fällen wird eine Fehlermeldung ausgegeben. Die Anweisung an die umgebende Webseite, eine neue URL zu laden, könnte prinzipiell auch "straightforward" programmiert werden. Hier müssen sie sich jedoch auf Dinge ausserhalb ihres eigenen Einflussbereichs verlassen - die Webseite wurde vielleicht schon gelöscht oder umbenannt, der Server ist zu langsam, ... In solchen Fällen setzen sie die statements immer in einen try-Block und sehen anschliessend einen eigenen Exception-Handler vor. |
int i=0; // 3 Versuche
public void PasswortPruefen() { String eingabetext=""; if(eingabetext!=null) { eingabetext=Passwortfeld.getText(); if(i<3) { if(eingabetext.equals("prime")) { try { URL appletseite=getCodeBase(); URL seite=new URL(appletseite,"ziel.htm"); AppletContext dasApplet=getAppletContext(); dasApplet.showDocument(seite); } catch (MalformedURLException ex) { Graphics g=getGraphics(); g.drawString("Fehler beim Laden von "+ex,10,50); } } else { Graphics g=getGraphics(); g.drawString("Falsches Passwort !",10,50); } } else { try { URL page=new URL(getCodeBase(),"sorry.htm"); getAppletContext().showDocument(page,"abc"); } catch (MalformedURLException ex) { Graphics g=getGraphics(); g.drawString("Fehler beim Laden von "+ex,10,50); } } } } |
| Aktuelle Daten dieser Seite | Letzte Änderung: |
| |