Ähnlich wie HTML mit Java-Script können die Oberflächen-Spezifikationen des GuiBuilder auch mit Scripten versehen werden.
Hierzu muß entweder die Script-Sprache Pnuts (website) von Sun installiert sein oder BeanShell (website).
Hinweis:
Die Weiterentwicklung von Pnuts ist offenbar eingestellt worden (seit Januar
2001 kein Update mehr). Die Unterstützung von Pnuts durch den GuiBuilder
wird daher perspektivisch entfallen; auch deshalb, weil sich BeanShell als
Script-Sprache im Java-Umfeld weitgehend durchgesetzt hat.
Es wird also dringend geraten keine neuen Pnuts-Scripte mehr zu erzeugen,
und alte Projekt nach und nach auf BeanShell umzustellen.
Die entsprechende Bibliothek - pnuts.zip oder bsh.jar - wird einfach in das
Verzeichnis guibuilder/lib
kopiert (bei BeanShell den JAR-File
ggf. in bsh.jar
umbenennen!) oder muß im CLASSPATH enthalten
sein.
Der GuiBuilder findet dann selbst heraus, welche Scriptsprache installiert ist (es dürfen auch beide "gemischt" eingesetzt werden!).
Das programmierte Script steht immer hinter der Spezifikation eines Fensters (Form, Dialog, Applet).
<Form label="MyForm">
...
</Form>
<Script language="BeanShell">
...
</Script>
Das Programm kann unmittelbar in die Oberflächen-Spezifikation eingegeben werden. Alternativ können wiederverwendbare Scripte auch eingebunden werden:
<Script language="BeanShell" src="MyScript.bsh"/>
Innerhalb eines Scripts können beliebige Funktionen definiert werden, die auf Benutzerereignisse reagieren.
Die Funktion ist bei dem jeweiligen Ereignis einzutragen.
<Button label="Drück mich" cmd="buttonPressed" />
...
<Script language="BeanShell">
<!--
import de.guibuilder.framework.*;
import de.guibuilder.framework.event.*;
buttonPressed(event) {
event.action.setText("Danke!");
}
-->
</Script>
Es müssen mit den Importanweisungen die entsprechenden Bibliotheken eingebunden sein.
Hinweis: Es wird dringend empfohlen, das Script als XML-Kommentar zu notieren! Nur so ist es möglich, daß das Script selbst XML-Code enthalten kann.
Alle vom GuiBuilder über Ereignismethoden aufgerufenen Funktionen
müssen mit genau einem Argument deklariert werden, in dem das
auslösende Ereignis übergeben wird.
Die gewünschten Informationen werden dann aus
GuiUserEvent
entnommen.
Sollen einmal entwickelte Scripts in verschiedenen Fenstern wiederverwendet
werden - also globale Routinen, können sie mit
require("[myDir/myScript]")
eingebunden, und die darin enthaltenen
Funktionen aufgerufen werden. Die Extension .pnut
kann dabei
weggelassen werden. Die Pfandangabe kann relativ zu dem Verzeichnis sein,
aus dem der GuiBuilder gestartet wurde.
Bei einem Haupt-Container (Form, Dialog, InternalFrame) kann ein Script als Controler für die Benutzereingaben festgelegt werden.
<Form label="Test Form" controler="MyScript.pnut">
<Form label="Test Form" controler="MyScript.bsh">
Die File-Extension muß dabei .pnut
oder
.bsh
sein!
Soll zu einem späteren Zeitpunkt ein "richtiger" (in Java implementierter)
Controler eingesetzt werden, ist im Attribut controler
die
entsprechende Java-Klasse zu nennen; diese Klasse muß im Classpath
des GuiBuilders enthalten sein (das current Directory ist bereits im Classpath
enthalten) und entweder eine statische Methode "getInstance()
"
haben oder einen default-Constructor.
<Form label="Test Form"
controler="de.mydomain.MyControler">
Pnuts-Scripting im Applet funktioniert nur, wenn mit dem Policy-Tool zwei Permissions hinzugefügt werden:
permission pnuts.lang.PackagePermission "::", "write, add";
permission java.util.PropertyPermission "*", "read, write";
Wenn das Policy-Tool die Klasse
pnuts.lang.PackagePermission
nicht findet, dann die Fehlermeldung
ignorieren.
Naturgemäß können Scripte im Applet auch nicht kompiliert werden.
In GApplet.html
ist pnuts.zip
nicht in der Liste
des CACHE_ARCHIVE aufgeführt; wenn Sie Pnuts im Applet nutzen wollen,
müssen Sie dieses also nachtragen.
Funktions-Namen von Pnuts Build-in Functions dürfen naturgemäß nicht verwendet werden; es wird eine entsprechende Warnung ausgegeben.
Build-in Functions sind:
Je Gui-Definitions-File kann nur ein Script definiert werden. Wenn Gui-Scripte mit "Use" eingebunden werden oder bei dem Navigator-Pattern für die Nodes unterschiedliche Panel definiert sind, so können diese eigene Scripte haben. Ist dieses nicht der Fall, werden ggf. definierte Funktionen vom Hauptfenster verarbeitet.
Im Prinzip ist es denkbar, jedem Member ein eigenes Script zu verpassen; unklar ist, ob dieses sinnvoll ist.
Vorschlag 1 (Jedes Widget hat ein Script):
<Text label="Eingabe:" OnChange="modified"
OnDblClick="dblClick">
<Script language="Pnuts">
import ("de.guibuilder.framework.event.*")
function modified(event) {
System::out.println(event.value)
}
function dblClick(event) {
...
}
</Script>
</Text>
Vorschlag 2 (Jedes Ereignis hat ein Script):
<Text label="Eingabe:">
<OnChange language="Pnuts">
import ("de.guibuilder.framework.event.*")
System::out.println(event.value)
</OnChange>
<OnDblClick language="BeanShell">
import de.guibuilder.framework.event.*;
System.out.println(event.value);
...
</OnDblClick>
</Text>