GuiBuilder API und Scripting Tutorial
Hier wird zum Einstieg ein Überblick über die wichtigsten Methoden
des GuiBuilder-Frameworks gegeben. Ein intensiverer Umgang setzt das Studium
von JavaDoc voraus, sowie ein Verständnis
des Objekt-Modells.
Einige Beispiel-Scripts finden sich unter
guibuilder/lib/example/Pnuts und example/BeanShell
.
Umgang mit der GuiFactory
Ein Hauptfenster (Formular, Dialog) wird mit Hilfe der GuiFactory erzeugt.
Dieses kann auf Grundlage eines Datenamens oder eines Strings erfolgen.
Bei Angabe eines Dateinamens wird die zuvor gesetzte DocumentBase
berücksichtigt (siehe GuiUtil.setDocumentBase).
Beachten Sie, daß Pnuts für den Zugriff auf statische Methoden
einen "::"
verlangt:
GuiFactory::getInstance()
myWin = GuiFactory.getInstance().createWindow("MyScript.xml");
myWin = GuiFactory.getInstance().createWindowXml(
"<?xml version='1.0' encoding='ISO-8859-1'?>
<!DOCTYPE GDL SYSTEM 'gdl.dtd'>
<GDL>
<Dialog label='MyDialogTitle'>
<Text label='Eingabe:' />
<Button label='OK' x='1'/>
</Dialog>
</GDL>");
Fenster-Manipulationen
Wichtige Methoden:
-
show()
-
Zeigt ein Fenster an.
-
boolean showDialog()
-
Nur für modale Dialoge, die hier wie eine Funktion eingesetzt werden.
Liefert "true", wenn der Benutzer den OK-Button des Dialoges betätigt
hat, ansonsten "false".
-
hide()
-
Versteckt das Fenster; es kann anschließend mit show() wieder angezeigt
werden.
-
dispose()
-
Vernichtet das Fenster. Achtung! Anschließend die Objekt-Referenz auf
das Fenster auf null setzen.
-
setTitle(String title)
-
Setzt die Beschriftung in der Titelzeile des Fensters.
-
reset()
-
Leert alle Eingabefelder des Fensters. Bei allen Members wir die Eigenschaft
"modified" auf "false" gesetzt.
-
verify()
-
Überprüft alle Eingabefelder auf gültige Eingaben (notNull,
minLen, maxLen, usw.).
Es wird eine IllegalStateException geworfen, wenn ungültige Eingaben
vorliegen.
-
Document getAllValuesXml()
-
Liefert die Eingaben als ein Xml-Document.
-
setAllValuesXml(Document doc)
-
Setzt alle Felder auf den Inhalt des übergebenen Documents.
Achtung!
Es wird eine IllegalArgumentException geworfen, wenn in dem Document Feldnamen
enthalten sind, die im Fenster nicht definiert sind.
-
Object getValue(String memberName)
-
Liefert den Inhalt des angegebenen Feldes.
-
setValue(String memberName, Object value)
-
Füllt des angegebene Feld mit dem angegebenen Inhalt.
-
GuiRootPane getRootPane()
-
Jedem Fenster ist eine RootPane zugeordnet; hier sind weitere Methoden
verfügbar.
-
GuiPanel getRootPane().getMainPanel()
-
Der RootPane ist immer genau ein Haupt-Panel zugeordent; hier sind weitere
Methoden verfügbar.
-
Umgang mit modalen Dialogen.
Modale Dialoge können wie eine Funktion eingesetzt werden:
Script "MyDialog.xml"
<Dialog label="MyDialog" typ="MODAL">
<Text label="Text:" />
<!-- Dieser Button liefert "true" -->
<Button label="OK" file="Close()" />
<!-- Dieser Button liefert "false" -->
<Button label="Cancel" file="Cancel()" />
</Dialog>
Verwendung dieses Dialoges mit Java:
// Dialog von der Factory erzeugen
lassen.
GuiDialog myDialog =
(GuiDialog)GuiFactory.getInstance().createWindow("MyDialog.xml");
// Dialog mit Werten füllen.
myDialog.setValue("text", "Hier steht ein Text");
// Dialog anzeigen, und auf Schließen des Dialoges durch den Benutzer
warten.
// Die Control-Box des Dialoges liefert gleichfalls "false".
if (myDialog.showDialog()) {
// Benutzereingaben auslesen.
String eingabe = myDialog.getValue("text");
}
// Aufräumen, wenn der Dialog nicht mehr benötigt wird.
myDialog.dispose();
myDialog = null;
Mit BeanShell wirds etwa einfacher:
...
<Button label="Drück mich" cmd="actionPerformed" />
...
<Script language="BeanShell">
import de.guibuilder.framework.*;
import de.guibuilder.framework.event.*;
actionPerformed(event) {
myDialog =
GuiFactory.getInstance().createWindow("MyDialog.xml");
myDialog.setValue("text", "Hier steht ein
Text");
if (myDialog.showDialog()) {
eingabe = myDialog.getValue("text");
}
myDialog.dispose();
myDialog = null;
}
</Script>
GuiRootPane
(Fast) alle Komponenten verfügen über eine Methode getRootPane();
auf dieses Objekt kann also jederzeit zugegriffen werden.
-
GuiPanel getMainPanel()
-
Liefert das Wurzel-Panel für alle weiteren Komponenten.
-
GuiMenuBar getGuiMenuBar()
-
Für Zugriff auf Menubar.
-
GuiToolbar getToolBar()
-
Für Zugriff auf Toolbar.
-
GuiWindow getParentWindow()
-
Das Formular, Dialog usw. zu diesem RootPane.
-
getCurrentTable() / getCurrentTree() / getSplit()
-
Vorsicht:
Der Returnwert kann auch dann null sein, selbst wenn eine oder mehrere
Komponenten in der Oberfläche vorhanden sind, der Benutzer aber z.B.
noch keine Tabelle angeklickt hat.
-
activateTab(String tabname) / enableTab(String tabname, boolean b) /
enableAllTabs(boolean b)
-
Diese Methoden setzen voraus, daß die Namen der Registerkarten eindeutig
sind.
-
Methoden auf Container-Ebene
Container sind vor allem Registerkarten, und (wenn besonders gekennzeichnet)
auch Panels und beschriftete Rahmen. Das HauptPanel eines Fensters ist immer
über myWindow.getRootPane().getMainPanel()
erreichbar.
-
GuiMember getMember(String memberName)
-
Liefert das Objekt mit dem angegebenen Namen. Dieses ist naturgemäß
eine von GuiMember abgeleitete Klasse; also ein weiterer Container oder eine
von GuiComponent abgeleitete Klasse.
Mit myMember.getGuiType()
kann ermittelt werden, um was es sich
eigentlich handelt.
-
GuiAction getAction(String actionName)
-
Liefert den Menüeintrag oder den Button mit dem angegebenen Namen.
Achtung! Alle Menüeinträge der MenuBar sind immer dem MainPanel
zugeordnet.
-
ArrayList getMemberNames()
-
Liefert eine ArrayList von Strings mit allen Member-Namen in der Reihenfolge
ihrer Spezifikation.
-
reset()
-
Leert alle Eingabefelder des Fensters und setzt bei allen enthaltenen
Child-Komponenten modified auf "false".
-
verify()
-
Überprüft alle Eingabefelder auf gültige Eingaben (notNull,
minLen, maxLen, usw.).
Es wird eine IllegalStateException geworfen, wenn ungültige Eingaben
vorliegen.
-
Document getAllValuesXml()
-
Liefert die Eingaben als ein Xml-Document.
-
setAllValuesXml(Document doc)
-
Setzt alle Felder auf den Inhalt des übergebenen Documents.
Achtung!
Es wird eine IllegalArgumentException geworfen, wenn in dem Document Feldnamen
enthalten sind, die im Fenster nicht definiert sind.
-
Object getValue(String memberName)
-
Liefert den Inhalt des angegebenen Feldes.
-
setValue(String memberName, Object value)
-
Füllt des angegebene Feld mit dem angegebenen Inhalt.
Methoden auf Member-Ebene
GuiMember ist eine abstrakte Klasse, die zusammen mit GuiContainer und GuiElement
ein Kompositum Pattern bilden: Ein Container enthält Member, die wiederum
Container oder Elemente sind.
Auch GuiElement und GuiContainer sind abstrakt; von ihnen sind weitere -
auch abstrakte - Klassen abgeleitet.
GuiAction erweitert GuiElement, und wird seinerseit von GuiButton und GuiMenuItem
erweitert. Hier handelt es sich also um Klassen, mit deren Hilfe der Benutzer
eine Aktion auslösen kann.
Achtung!
GuiMenuItemOption und GuiMenuItemCheck lösen keine derartige
Benutzeraktionen aus, sondern sind in ihrem Verhalten einem RadioButton bzw.
einer CheckBox vergleichbar!
GuiComponent erweitert GuiElement und repräsentiert die abstrakte
Basis-Klasse für alle Oberflächenkomponenten, die einen Inhalt
haben können, den der Benutzer (zumeist) durch Eingaben manipulieren
kann; also TextFelder, ComboBoxen, RadioButtons usw.
GuiTable und GuiTree haben naturgemäß spezielle Eigenschaften.
Siehe auch die entsprechenden
Klassendiagramme.
GuiMember
-
String getName()
-
Liefert den - innerhalb eines Containers - eindeutigen Namen.
-
int getGuiType()
-
Liefert den Typ der Komponente.
-
JComponent getJComponent()
-
Die eigentlichen Swing-Komponenten werden vom GuiBuilder per Delegation
angesprochen. Für den Ausnahmefall, daß das Swing-Objekt direkt
manipuliert werden soll, kann man sich hierüber eine ObjektReferenz
verschaffen.
-
long getOid() / setOid(long oid)
-
Dieses Attribut wird vom GuiBuilder selbst niemals benutzt; der Anwender
hat hier die Möglichkeit, seine eigene Object-ID (oder was auch immer)
abzulegen, und später wieder darauf zuzugreifen.
getOid() liefert -1, wenn keine oid gesetzt wurde.
-
Object getUserObject() / setUserObject (Object o)
-
Auch dieses Attribut wird vom GuiBuilder selbst niemals verwendet; der Anwender
kann für seine Zwecke eine beliebige Objekt-Referenz eintragen.
-
Object getControler() / setControler(Object c)
-
Der Controler ist dasjenige Objekt, an welches Benutzerereignisse weitergereicht
werden können.
getControler()
liefert u.U. den Controler des Parents, wenn
bei der Komponente selbst kein Controler eingetragen wurde.
Beim Einsatz von Scripting hat dieses Vorrang.
Nachmal langsam zum mitdenken:
Wenn Sie eine Ereignis-Methode OnChange="machWas
" definiert
haben, und Sie im Script eine Funktion
machWas(event)
geschrieben haben, wird diese
aufgerufen; gibt es diese Methode in Ihrem Script nicht (oder gibts es in
diesem Dialog gar kein Script), wird nach einem Controler gesucht, der über
eine Methode machWas(GuiUserEvent event)
verfügt.
Sie können damit Pnuts- oder BeanShell-Scripts ähnlich wie JavaScript
einsetzen, also die einfachen Dinge per Scripting erledigen und die wesentlichen
an den Server weiterreichen.
-
GuiElement
-
setEnabled(boolean b) / boolean isEnabled()
-
Ein Element kann aktiviert oder deaktiviert, d.h. für Benutzeraktionen
gesperrt werden.
-
GuiTable getParentTable()
-
Wenn das Element Spalte in einer Tabelle ist, kann hierauf auf diese zugegriffen
werden.
GuiComponent
-
Object getValue() / setValue(Object o)
-
Liefert oder setzt den Inhalt der Komponente. Je nach Komponente sind dieses
naturgemäß verschiedene Klassen.
-
int getDataType()
-
Liefert den Datentyp, den dieses Element speichern kann.
-
isModified() / setModified()
-
Die Eigenschaft "modified" wird durch Benutzereingaben vom GuiBuilder auf
"true" gesetzt.
Ein reset() beim Container setzt diese Eigengschaft wieder auf "false".
GuiTable
Eine Tabelle hält eine Menge von Spalten, die das Interface
TableColumnAble
implementieren. Außerdem eine Menge von Zeilen vom Typ GuiTableRow.
-
Document getAllValuesXml() / setAllValuesXml(Element e)
-
Der Inhalt einer Tabelle kann mit XML-Dokumenten gefüllt oder ausgelesen
werden.
-
insertRow() / insertRow(int index) / insertRow(GuiTableRow row) /
insertRow(GuiTableRow, int index)
-
Es wird eine Zeile eingefügt und die eingefügte Zeile erhält
die Eingenschaft inserted = true.
Ist keine Index angegeben, wird die Zeile am Ende der Tabelle
angefügt.
Wird kein Objekt GuiTableRow angegeben, wird eine Leerzeile eingefügt.
-
deleteRow() / deletRow(int index)
-
Es wird eine Zeile aus der Tabelle gelöscht.
Ist kein Index angegeben, wird die selektierte Zeile gelöscht.
-
Vector getDeletedRows()
-
Liefert einen Vector von GuiTableRows, die mit deleteRow() gelöscht,
aber ohne die, die neu inserted wurden.
-
reset()
-
Leert die Tabelle.
-
int getSelectedRow()
-
Liefert die selektierte Zeile oder -1, wenn keine Zeile selektiert.
-
GuiTableRow getRow(int index)
-
Liefert die Zeile mit dem angegebenen Index.
GuiTableRow
-
boolean isInserted()
-
Liefert true, wenn die Zeile frisch inserted wurde.
-
boolean isEditable() / setEditable(boolean b)
-
Einzelne Zeilen können auf nicht editierbar gesetzt werden.
-
boolean isModified() / setModified(boolean b)
-
Bei Benutzereingaben setzt der GuiBuilder die Eigenschaft modified automatisch
auf "true".
-
Vector getData() / setData(Vector v)
-
Liefert den Inhalt der Spalten als Vector bzw. setzt ihn.
-
Object getValueAt() / setValueAt(Object o)
-
Der Inhalt einer Zelle kann ausgelesen oder gesetzt werden.
-
long getOid() / setOid(long oid)
-
Der Zeile kann vom Anwender eine beliebige ObjectId für seine eigenen
Zwecke zugewiesen werden.
GuiTree
Die Tree-Komponente hält eine in sich gegliederten Menge von GuiTreeNodes.
-
Document getAllValuesXml() / setAllValuesXml(Element e)
-
Der komplette Baum wird auf XML angebildet.
-
GuiTreeNode getSelectedNode() / setSelectedNode(String path)
-
Der vom Benutzer selektierte Node kann ausgelesen oder gesetzt werden.
-
addGuiNode(GuiTreeNode node) / addGuiNode(String title) / addGuiNode(String
title, String name)
-
Es wird eine neuer Node unterhalb des selected Nodes eingehängt.
-
cutNode()
-
Löschen den selektierten Node.
Der gelöschte Node kann später mit pasteNode() wieder eingefügt
werden.
-
copyNode()
-
Der selektierte Node wird kopiert und kann später mit pasteNode()
eingefügt werden.
-
pasteNode()
-
Fügt den kopierten oder gelöschten Node unterhabl des selektierten
Nodes ein.
Kopierte Nodes werden ge-clone-d.
GuiTreeNode
Die Besonderheit dieser Komponente besteht darin, daß hier ein
"Navigator-Pattern" implementiert ist:
Ein Node kann einen Verweis auf ein Panel halten, daß im rechten Fenster
eines Split-Panels angezeigt wird.
Hierbei ist zu beachten, daß viele Nodes durchaus auf das selbe Panel
verweisen können, aber unterschiedliche Inhalte repräsentieren.
Der GuiBuilder erzeugt das Swing-Panel dann nur ein einziges mal. Die dem
Panel entsprechenden Daten werden jedoch vom Node in einem Xml-Dokument
vorgehalten, und wenn der Benutzer zwischen den verschiedenen Nodes wechselt
jeweils zugewiesen.
-
GuiTreeNode(String title) / GuiTreeNode(String title, String name)
-
Erzeugt einen neuen Node.
-
String getFileName() / setFileName(String filename)
-
Einem TreeNode kann der Dateiname eines GuiBuilder-Scripts zugewiesen
werden.
Diese Spezifikation muß vom Typ GuiPanel sein.
Hierbei ist es erlaubt, daß beliebig viele Nodes auf die selbe
Spezifikation verweisen; z.B. um eine Menge von Adressen darzustellen.
-
GuiPanel getPanel()
-
Liefert das dem TreeNode zugeordenete Panel, wenn es mit setFileName() eines
definiert wurde.
Sollte das Panel noch nicht existieren, wird es jetzt von der Factory erzeugt.
-
Document getAllValuesXml() / setAllValuesXml(Element e)
-
Der Inhalt des XML-Dokuments entspricht dem des zugeordenten Panels.
-
setIconName(String name)
-
Jedem Node kann ein individueller Icon zugewiesen werden; es ist die nur
der Datename (relativ zur Codebase) anzugeben.
-
setName() / getName()
-
Schwesterknoten müssen eindeutige Namen haben.
-
GuiTreeNode getChildByName(String name)
-
Liefert einen Tochter-Knoten über seinen Namen.
-
long getOid() / setOid(long oid)
-
Dem Node kann vom Anwender eine beliebige ObjectId für seine eigenen
Zwecke zugewiesen werden.
-
getValue(String xpath) / setValue(String xpath, String value)
-
Der Inhalt des vom TreeNode gehaltenen XML-Documents kann über diese
Methoden gelesen / geändert werden ohne daß der Node sichtbar
ist; XPath-Angabe in Punkt-Notation:
getValue("myTab.myTextBox");
GuiUtil
Diese Klasse umfaßt nur statische Methoden.
-
String[] fileOpenDialog() / fileSaveDialog()
-
Es wird der Plattform-spezifischer Datei-Öffnen oder Datei-Speichern-Dailog
aufgerufen, und die Wahl des Benutzers in einem Array von drei String
zurückgegeben: Voller Dateiname, Directory, Dateiname.
-
URL getDocumentBase() / setDocumentBase(URL)
-
Liefert oder setzt die URL unter der die Gui-Scripte von der Factory gelesen
werden; ist vom Typ file oder http.
-
awt.Image makeAwtImage(String filename)
-
Erzeugt ein Image unter Angabe eines Dateinamens unter Berücksichtigung
von DocumentBase.
-
swing.ImageIcon makeIcon(String filename)
-
Erzeugt ein ImageIcon unter Angabe eines Dateinamens.
-
boolean okCancelMessage()
-
Zeigt eine OK/Abbrechen MessageBox und liefert "true", wenn OK.
-
showMessage()
-
Zeigt eine einfache Messagebox mit Button OK.
-
boolean yesNoMessage()
-
Zeigt eine Ja/Nein-Messagebox und liefert "true" bei "JA".
-
-
home