BeanyHappy Scripting


Ä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.

Pnuts Scripts wiederverwenden

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.

Script als Controler einsetzen

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">

Hinweise

Scripting im Applet mit Pnuts

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.

Interne Funktions-Namen von Pnuts

Funktions-Namen von Pnuts Build-in Functions dürfen naturgemäß nicht verwendet werden; es wird eine entsprechende Warnung ausgegeben.

Build-in Functions sind:

Offenes Problem:

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>


home