From 33613a85afc4b1481367fbe92a17ee59c240250b Mon Sep 17 00:00:00 2001 From: Sven Eisenhauer Date: Fri, 10 Nov 2023 15:11:48 +0100 Subject: add new repo --- .../hjp5/html/k100282.html | 618 +++++++++++++++++++++ 1 file changed, 618 insertions(+) create mode 100644 Master/Reference Architectures and Patterns/hjp5/html/k100282.html (limited to 'Master/Reference Architectures and Patterns/hjp5/html/k100282.html') diff --git a/Master/Reference Architectures and Patterns/hjp5/html/k100282.html b/Master/Reference Architectures and Patterns/hjp5/html/k100282.html new file mode 100644 index 0000000..53ae047 --- /dev/null +++ b/Master/Reference Architectures and Patterns/hjp5/html/k100282.html @@ -0,0 +1,618 @@ + + + +Handbuch der Java-Programmierung, 5. Auflage + + + + + + + + + +
 Titel  + Inhalt  + Suchen  + Index  + DOC  +Handbuch der Java-Programmierung, 5. Auflage +
 <<  +  <   +  >   + >>  + API  +Kapitel 44 - Beans +
+
+ + + + +

44.3 Die Beanbox

+
+ +
+ + + + +

44.3.1 Beschreibung und Installation

+ +

+Zur Unterstützung beim Entwurf und Testen von Beans und als Referenzplattform +für die Demonstration des Bean-Konzepts wurde von SUN das Bean +Development Kit (kurz BDK) +entwickelt. Es wird frei zur Verfügung gestellt und kann beispielsweise +über die Java Beans Homepage von +http://java.sun.com/products/javabeans/ +heruntergeladen werden. Während der Erstellung dieses Kapitels +wurde die Version 1.1 verwendet. Wichtigster Bestandteil des BDK ist +die Beanbox, die eine einfache Umgebung zum Testen von selbstentwickelten +Beans zur Verfügung stellt. Bevor wir uns ihrer Bedienung zuwenden, +soll die Installation des BDK beschrieben werden. +

+ + + + + + + + + + + +
+ +

+Die Beanbox sollte nicht als vollwertige Test- und Entwicklungsumgebung +für Java-Beans betrachtet werden. Dazu ist sie zu schwach. Sie +wurde lediglich entwickelt, um die Bean-Konzepte zu illustrieren und +eine erste Möglichkeit für ihre Anwendung zur Verfügung +zu stellen. Bei weitergehendem Einsatz stößt man schnell +an die Grenzen der Beanbox, und ihr praktischer Nutzen ist recht begrenzt.

+ + + + +
 Warnung 
+
+ + + + +

Installation des BDK

+ +

+Die Installation des BDK ist einfach; Voraussetzung ist ein funktionierendes +JDK. Unter Windows gibt es ein menügesteuertes Installationsprogramm +»bdk1_1-win.exe«, das die meisten Schritte übernimmt. +Nachdem es gestartet wurde, müssen zunächst die Lizenzbedingungen +akzeptiert werden, dann ist die Eingabe des Installationsverzeichnisses +erforderlich. Sind mehrere Java-Interpreter vorhanden, muss anschließend +ausgewählt werden, welcher von ihnen zum Betrieb des BDK verwendet +werden soll. Nach Drücken des »Install«-Buttons wird +dann mit der Installation begonnen. Die Installationsroutine legt +auch einen Uninstall-Eintrag an, mit dem das BDK bei Bedarf deinstalliert +werden kann. + + + + +

Die Aufrufscripte

+ +

+Nach der Installation befindet sich eine Datei run.bat +im Unterverzeichnis beanbox +des BDK-Verzeichnisses (analog dazu gibt es das Shell-Script run.sh +zum Starten der Beanbox auf UNIX-Systemen). Diese Batchdatei setzt +den CLASSPATH auf die benötigten +Klassen- und .jar-Dateien und startet +die Beanbox. Sie ist leider etwas archaisch. Einerseits wird der aktuelle +CLASSPATH überschrieben. +Zudem war sie im Test mitunter instabil, wenn der HotSpot-Compiler +aktiviert war. Eine modifizierte Version von run.bat +könnte etwa so aussehen (analoge Anpassungen können für +die UNIX-Version vorgenommen werden): + +

+@echo off
+set OLDCP=%CLASSPATH%
+echo saving old CLASSPATH in OLDCP: %OLDCP%
+set CLASSPATH=classes;..\lib\methodtracer.jar;..\infobus.jar
+java -classic sun.beanbox.BeanBoxFrame
+set CLASSPATH=%OLDCP%
+set OLDCP=
+echo CLASSPATH restored to %CLASSPATH%
+
+ + + + + +

44.3.2 Grundlagen der Bedienung

+ +

+Nach dem Aufruf des Startscripts run +wird die Beanbox gestartet und präsentiert ihre aus vier Top-Level-Frames +bestehende Arbeitsoberfläche: + + + + +

Bedienelemente

+

+ + +

+ +

+Abbildung 44.2: Die Beanbox

+ + + + + +

Einfügen und Modifizieren von Beans

+ +

+Um eine Bean zu bearbeiten, muss sie zunächst im GUI-Designer +platziert werden. Dazu ist sie in der Toolbox anzuklicken und mit +einem erneuten Klick im GUI-Designer zu platzieren. Der schraffierte +Rand zeigt an, dass sie ausgewählt wurde und ihre Eigenschaften +im Property-Editor modifiziert werden können. Durch Ziehen an +einem der vier Ränder kann die Bean beliebig verschoben werden. +Ist ihre Größe variabel, kann sie durch Ziehen an einer +der vier Ecken verändert werden. Soll eine Bean aus dem GUI-Designer +entfernt werden, ist sie zu markieren und mit dem Menüpunkt »Edit.Cut« +zu löschen. +

+ + + + + + + + + + + +
+ +

+Beachten Sie bitte, dass das Verschieben der Bean und das Ändern +ihrer Größe ausschließlich durch Mausklicks auf +ihrem Rand ausgeführt wird. Mausoperationen im Inneren der +Bean werden als reguläre Ereignisse gewertet und direkt an das +zu diesem Zeitpunkt bereits instanzierte Bean-Objekt weitergeleitet.

+ + + + +
 Tipp 
+
+ +

+Als Beispiel wollen wir die vordefinierte Bean »OrangeButton« +im GUI-Designer platzieren. Sie stellt sich zunächst als oranges +Rechteck dar, das nach einem Mausklick kurz die Farbe wechselt. Im +Property-Editor können die öffentlichen Eigenschaften der +Bean verändert werden: +

+ + + + +

Events

+ +

+Die Beanbox bietet die Möglichkeit, eine Bean über die von +ihr generierten Events mit einer anderen Bean zu verbinden. Um das +beispielhaft zu demonstrieren, soll zusätzlich eine Instanz der +Bean vom Typ »EventMonitor« im GUI-Designer platziert werden. +Dann klicken wir den Button an und rufen den Menüpunkt »edit.Events.buttonPushed.actionPerformed« +auf. Wenn die Maus nun den Button verläßt, bleibt sie über +eine rote Linie mit dem Button verbunden. Wir ziehen diese Linie auf +den »EventMonitor« und führen einen weiteren Mausklick +aus. In der nun angezeigten Liste aufrufbarer Methoden wählen +wir den (einzigen) Eintrag initiateEventSourceMonitoring +aus. + +

+Die Beanbox generiert nun Java-Code für eine Adapterklasse, kompiliert +ihn und legt die resultierenden Dateien im Unterverzeichnis tmp\sunw\beanbox +ab. Gleichzeitig registriert sie die Adapterklasse für das Action-Ereignis +des Buttons und sorgt durch den Aufruf der ausgewählten Methode +innerhalb von actionPerformed +dafür, dass der Event-Listener bei jedem Buttonklick benachrichtigt +wird. Seine Aufgabe besteht darin, die ausgelösten Ereignisse +zu speichern und in einer Listbox auf dem Bildschirm anzuzeigen. +

+ + + + + + + + + +
+ +

+Auf diese Weise lassen sich prinzipiell beliebige Beans miteinander +verbinden. Die Einschränkung der Beanbox besteht lediglich darin, +dass sie nur Adapterklassen für den Aufruf von parameterlosen +Methoden erzeugen kann. Fortgeschrittenere GUI-Designer würden +es erlauben, auch parametrisierte Methoden aufzurufen. Sie würden +zusätzlich einen Editor zur Verfügung stellen, mit dem der +erzeugte Code per Hand angepasst werden kann.

+ + + + +
 Hinweis 
+
+ + + + +

44.3.3 Integration eigener Beans

+ +

+Neben den vordefinierten können auch eigene Beans in die Beanbox +integriert werden. Sie können dann wie vordefinierte verwendet, +manipuliert und serialisiert werden. Im folgenden wollen wir beschreiben, +welche Schritte nötig sind, um eine Bean in der Beanbox verwendbar +zu machen. Für die Einbindung in eigene GUI-Designer kann eventuell +eine etwas andere Vorgehensweise erforderlich sein. Dazu sollte die +Bean-Dokumentation des jeweiligen Entwicklungssystems konsultiert +werden. + + + + +

Entwickeln und Übersetzen der Bean

+ +

+Die ersten beiden Schritte, das Entwickeln und Übersetzen der +Bean, haben wird schon erledigt. Sie unterscheiden sich in keiner +Weise von der einer herkömmlichen Java-Klasse. Als Ergebnis ensteht +eine Klasse LightBulb.class +mit dem Bytecode der Glühlampen-Bean. + + + + +

Erzeugen einer Manifest-Datei

+ +

+Um bei GUI-Designern mit einer großen Anzahl unterschiedlicher +Beans ein schwer zu durchschauendes Sammelsurium kleiner Klassendateien +zu vermeiden, werden Beans in jar-Archive verpackt und so an den GUI-Designer +übergeben. Eine jar-Datei darf beliebig viele Beans enthalten. +Um dem GUI-Designer die Möglichkeit zu geben, Klassen für +Beans von solchen mit reinen Hilfsfunktionen zu unterscheiden, wird +dem jar-Archiv eine Manifest-Datei +hinzugefügt, die ihren Inhalt beschreibt. Es handelt sich um +eine normale Textdatei, die für jede enthaltene Bean einen Eintrag +der folgenden Form enthält: +

+ + + + +
+ +
+Name: BeanClassFile.class
+Java-Bean: True
+
+
+
+ +

+Der erste Eintrag gibt den Klassennamen an. Der zweite besagt, dass +es sich um eine Bean handelt (Manifest-Dateien können auch noch +andere Informationen über die im Archiv gespeicherten Dateien +enthalten). Die Informationen werden zweckmäßigerweise +in eine Textdatei manifest.txt geschrieben +und beim Erzeugen der jar-Datei mit der Option »m« eingebunden. +Zum Einbinden der Glühlampe muss diese Datei also folgenden Inhalt +haben: + +

+Name: LightBulb.class
+Java-Bean: True
+
+ + + + + +

Erzeugen des jar-Archivs

+ +

+Nun kann das Kommando zum Erzeugen der jar-Datei abgesetzt werden +(wir wollen sie hjp3beans.jar nennen): + +

+jar cfm hjp3beans.jar manifest.txt LightBulb.class bulb*.gif
+
+ + +

+Die Option »c« steht für »create« und besagt, +dass eine neue jar-Datei angelegt werden soll. Das »f« steht +für »file« und gibt an, dass als erstes Argument hinter +den Kommandobuchstaben der Name der jar-Datei steht. Das »m« +steht für »manifest« und besagt, dass als nächstes +Argument der Name der Manifest-Datei folgt. Ganz zum Schluß +stehen die Namen der einzubindenden Dateien. In diesem Fall sind das +die Klassendatei und die zur Darstellung benötigten gif-Dateien +bulb1.gif und bulb2.gif. + +

+Die jar-Datei muss nun in das Unterverzeichnis jars +des BDK-Installationsverzeichnisses kopiert werden. Beim nächsten +Start der Beanbox wird sie automatisch gefunden, analysiert, und die +darin enthaltenen Beans werden im GUI-Designer zur Verfügung +gestellt. + + + + +

Verwenden der eigenen Bean

+ +

+Unsere Glühlampe wird nun in der Toolbox angezeigt und kann wie +jede andere Bean in den GUI-Designer übernommen werden. Im Eigenschaftenfenster +werden ihre Eigenschaften angezeigt und können interaktiv verändert +werden. Wird beispielsweise die Eigenschaft lightOn +von false +auf true +gesetzt, ändert die Bean ihren Zustand und die Glühlampe +leuchtet auf (siehe Abbildung 44.3). +Auch auf das Verändern der ererbten Eigenschaften (z.B. der Hintergrundfarbe) +reagiert unsere neue Komponente erwartungsgemäß mit einer +entsprechenden Änderung der grafischen Darstellung. +

+ + +

+ +

+Abbildung 44.3: Die Glühlampe in der BeanBox

+

+ + + + + + + + + +
+ +

+Die Definition der Klasse LightBulb +in Listing 44.3 enthält +eine Methode toggleLight, mit +der der Zustand der Lampe umgeschaltet werden kann. Da ihr Name nicht +den Design-Konventionen für getter- und setter-Methoden entspricht, +ist sie im GUI-Designer der Beanbox nicht sichtbar. In Abschnitt 44.6 +werden wir erläutern, wie man sie mit Hilfe einer BeanInfo-Klasse +dennoch sichtbar machen kann.

+ + + + +
 Hinweis 
+
+ + + + +

44.3.4 Serialisierte Beans

+ + + + +

Serialisieren von Beans mit der Beanbox

+ +

+Im vorigen Abschnitt wurde erwähnt, dass Beans serialisierbar +sein müssen. Dadurch ist ein GUI-Designer in der Lage, eine zum +Designzeitpunkt konfigurierte Bean dauerhaft zu speichern und sie +anderen Programmen vorkonfiguriert zur Verfügung zu stellen. + +

+Auch die Beanbox bietet eine einfache Möglichkeit, Beans zu serialisieren +und auf der Festplatte zu speichern. Dazu ist die gewünschte +Bean im GUI-Designer zu markieren und der Menüpunkt »File.SerializeComponent« +aufzurufen. Nun ist ein Dateiname anzugeben, unter dem die konfigurierte +Bean gespeichert werden soll. + +

+Im folgenden wollen wir annehmen, dass die Glühlampen-Bean in +der Beanbox so konfiguriert wurde, dass das Licht angeschaltet ist +und sie unter dem Namen »lb1.ser« persistent gespeichert +wurde. + + + + +

Einbinden serialisierter Beans

+ +

+Soll eine serialisierte und damit vorkonfigurierte Bean in einem Programm +verwendet werden, muss sie vor dem Einbinden deserialisiert werden. +Dazu wird ein ObjectInputStream +verwendet, der die Bean mit Hilfe eines FileInputStream +aus ihrer Datei liest. Anschließend kann das deserialisierte +Objekt durch Aufruf von add +in gewohnter Weise in den Dialog eingebunden werden: + + +

+ + + + + +
+ +
+001 /* Listing4405.java */
+002 
+003 import java.awt.*;
+004 import java.awt.event.*;
+005 import java.io.*;
+006 
+007 public class Listing4405
+008 extends Frame
+009 {
+010   public Listing4405()
+011   {
+012     super("LighBulbTest");
+013     setLayout(new FlowLayout());
+014     setBackground(Color.gray);
+015     addWindowListener(
+016       new WindowAdapter() {
+017         public void windowClosing(WindowEvent event)
+018         {
+019           System.exit(0);
+020         }
+021       }
+022     );
+023     loadLightBulb();
+024   }
+025 
+026   private void loadLightBulb()
+027   {
+028     try {
+029       ObjectInputStream is = new ObjectInputStream(
+030                              new FileInputStream("lb1.ser"));
+031       LightBulb bulb = (LightBulb)is.readObject();
+032       is.close();
+033       add(bulb);
+034     } catch (ClassNotFoundException e) {
+035       System.err.println(e.toString());
+036     } catch (IOException e) {
+037       System.err.println(e.toString());
+038     }
+039   }
+040 
+041   public static void main(String[] args)
+042   {
+043     Listing4405 frm = new Listing4405();
+044     frm.setLocation(100, 100);
+045     frm.pack();
+046     frm.setVisible(true);
+047   }
+048 }
+
+
+Listing4405.java
+ +Listing 44.5: Einbinden einer serialisierten Bean

+ +

+Wird das Programm gestartet, lädt es die Bean und zeigt sie mit +angeschaltetem Licht: +

+ + +

+ +

+Abbildung 44.4: Die deserialisierte Glühlampen-Bean

+
+ + + +
 Titel  + Inhalt  + Suchen  + Index  + DOC  +Handbuch der Java-Programmierung, 5. Auflage, Addison +Wesley, Version 5.0.1 +
 <<  +  <   +  >   + >>  + API  +© 1998, 2007 Guido Krüger & Thomas +Stark, http://www.javabuch.de +
+ + + -- cgit v1.2.3