kramann.info
© Guido Kramann

Login: Passwort:










kramann.info
© Guido Kramann

Login: Passwort:




Ergänzung von JavaBeans durch eine BeanInfo-Klasse

Vorbereitung einer neuen Java-Bean

  • Sollen im Property-Panel nicht sämtliche Attribute zum Ändern angezeigt werden und möchte man auch ein Icon für die eigene Bean, so sollte sie durch eine Beschreibungsklasse ergänzt werden.
  • Hat die Java-Bean den Namen "Klassenname", so muß die Beschreibungsklasse den Namen "KlassennameBeanInfo" tragen.
  • Durch die build.xml-Datei, die von ANT verarbeitet wird, muß gewährleistet werden, daß sowohl die Bean-Klasse, die BeanInfo-Klasse, als auch ggf. das Icon in die jar-Datei gepackt werden.
  • Als Beispiel wird ein Eingabeelement verwendet, mit dem sowohl über einen Schieberegler, als auch über ein Textfeld double-Zahlen eingegeben werden können.
  • Man soll über das Property-Panel den Default-Double-Wert, aber auch Minimum und Maximum für den Schieberegler einstellen können.
  • Desweiteren soll die Parameterbezeichnung und eine eindeutige ID wählbar sein.
  • Da die ID in allen zukünftigen Beans vorhanden sein sollen, wird dieses Attribut in eine Basisklasse der Bean eingefügt.
  • Die ID soll nicht mehr automatisch gesetzt werden, da so eine bessere Übersicht bei der Entwicklung unter NetBeans-IDE gewährleistet ist.
  • Die Dimensionierung des Elements erfolgt über die Oberfläche von NetBeans-IDE und wird nicht extra implementiert.
  • Da propertyChange(..) als Standard-Methode für die Kommunikation der Beans untereinander verwendet werden soll, wird diese in der BasisBean implementiert und sollte bei Bedarf in erbenden Klassen überschrieben werden.
  • ACHTUNG: In diesem Beispiel werden die der DoubleParameterBean-Klasse zugehörigen Klassen Schieber, SchieberLauscher und Textfeld als innere Klasse von DoubleParameterBean realisiert, um bei diesen wenig spezifischen Klassennamen nicht später einmal Namenskonflikte mit gleichnamigen Klassen im gleichen Package zu bekommen.
  • Auch bei der Fenster-Klasse wird eine Basisklasse zwischengeschaltet, die von JFrame erbt.
  • Dies ermöglicht beim Arbeiten in NetBeans-IDE eine einfachere Anpassung der Standard-JFrame-Klasse, indem dort ebenfalls nicht von JFrame, sondern von BasisFenster geerbt wird.
  • In der Basisklasse für das Fenster werden ebenfalls das Attribut ID und die Methode propertyChange(..) eingeführt, desweitere ein Container-Lauscher und eine Methode getComponentByID(String ID), vergl. hierzu die vorangegangenen Kapitel.
  • Es wird später auch noch eine Variante umgesetzt, die nicht von JFrame, sondern von JInternalFrame erbt.
  • Dies ermöglicht dann auch die Fenster-Komponente als JavaBean bereitzustellen.
  • Passend zur Klassenstruktur von NetBeans-IDE wird in einem Beispiel-Projekt die main-Methode in eine Extraklasse Main geschrieben.
  • Es folgt zum Download zunächst ein Projekt, das ohne NetBeans-IDE, aber im Hinblick darauf erstellt wurde:
  • Die Funktionalität entspricht den vorgangeangenen Projekten: Im dritten Eingabeelement wird immer die Summe aus den beiden vorangehenden angezeigt.
bean004a_BasisFenster.zip - Java-Anwendung mit vorbereiteter JavaBean-Klasse DoubleParameterBean.
Kompilieren, Start und Screenshot der Anwendung.

Bild 0-1: Kompilieren, Start und Screenshot der Anwendung.

Erstellen der .jar-Datei

  • Nun werden in einen Ordner die Java-Quelltextdateien BasisBean.java und DoubleParameterBean.java gelegt.
  • Für das Icon für die JavaBean wird in mtPaint ein 16x16 Pixel großes Icon mit 16 Farben gezeichnet und als .png-Datei mit dem Namen DoubleParameterBeanIcon.png im selben Verzeichnis abgespeichert.
  • Beim Abspeichern wird als transparente Farbe schwarz gewählt.
16x16-Pixel große .png-Datei mit 16 Farben mit transparenter Farbe schwarz.

Bild 0-2: 16x16-Pixel große .png-Datei mit 16 Farben mit transparenter Farbe schwarz.

  • In das gleiche Verzeichnis wird eine BeanInfo-Klasse gelegt, die den Namen DoubleParameterBeanBeanInfo.java tragen muß (s.o.).
  • Ihr Quelltext ist:
import java.awt.*;
import java.beans.*;
import java.lang.reflect.*;
public class DoubleParameterBeanBeanInfo extends SimpleBeanInfo
{
  public Image getIcon(int iconKind)
  {
    return loadImage("DoubleParameterBeanIcon.png");
  }  
  public PropertyDescriptor[] getPropertyDescriptors()
  {
    try 
    {
         return new PropertyDescriptor[] 
         {
             new PropertyDescriptor("ID",DoubleParameterBean.class),
             new PropertyDescriptor("bezeichnung",DoubleParameterBean.class),
             new PropertyDescriptor("wert",DoubleParameterBean.class)
         };
    } 
    catch (IntrospectionException e) 
    {
         System.out.println(e);
         return null;
    }
  }
}

Code 0-1: Java-Quellcode zu DoubleParameterBeanBeanInfo.java

  • Die Klasse liefert das erstellte Icon und die drei Attribute ID, bezeichnung und wert für das Parameter-Panel.
  • Eine build.xml-Datei, mit der nun ANT aus allen Datein die .jar-Datei erstellen kann sieht folgendermaßen aus:
<?xml version="1.0" encoding="ISO-8859-1"?>
    <project default="build">
        <dirname property="basedir" file=""/>
        <property name="beanname" value="DoubleParameterBean"/>
        <property name="jarfile" value="/.jar"/>
        <target name="build" depends="compile">
              <jar destfile="" basedir="" includes="*.class,*.png">
                  <manifest>
                      <section name=".class">
                          <attribute name="Java-Bean" value="true"/>
                      </section>
                  </manifest>
              </jar>
        </target>
        <target name="compile">
            <javac destdir="">
                <src location=""/>
            </javac>
        </target>
        <target name="clean">
            <delete file="">
                <fileset dir="" includes="*.class,*.gif"/>
            </delete>
        </target>
    </project> 

Code 0-2: XML-Datei build.xml zur Erstellung der .jar-Datei, um DoubleParameterBean in NetBeans-IDE einbinden zu können.

  • Sicht auf das Erstellungsverzeichnis vor Aufruf von ant:
Erstellungsverzeichnis vor Aufruf von ant.

Bild 0-3: Erstellungsverzeichnis vor Aufruf von ant.

  • Sicht auf das Erstellungsverzeichnis nach Aufruf von ant:
Erstellungsverzeichnis nach Aufruf von ant.

Bild 0-4: Erstellungsverzeichnis nach Aufruf von ant.

DoubleParameterBean.zip - Erstellungsverzeichnis und .jar-Datei für DoubleParameterBean.

Einfügen von DoubleParameterBean in NetBeans-IDE und Implementierung der Funktionalität über NetBeans-IDE

  • Entgegen dem bisherig erfolgten Ansatz soll an dieser Stelle auch gezeigt werden, wie aus NetBeans-IDE heraus Funktionalität implementiert werden kann.
  • Es wird zunächst ein Verzeichnis für ein neues NetBeans-IDE Projekt angelegt (hier bean007_Funktionalitaet_in_NetBeans), NetBeans-IDE gestartet und ein neues Java-Application-Projekt erzeugt (hier: projDoubleParameterBean).
  • Wieder muß der Packename vor der Main-Klasse von Hand gelöscht werden, s. Screenshot:
Einstellungen für Java-Application-Projekt.

Bild 0-5: Einstellungen für Java-Application-Projekt.

  • Im Default-Package der Source-Packages, wo auch die Main-Klasse liegt, wird ein neues JFrame-Form mit Namen Fenster erzeugt (rechte Maustaste bei <default package>).
JFrame-Form anlegen.

Bild 0-6: JFrame-Form anlegen.

  • Damit dem Projekt von vorne herein alle Klassen bekannt sind, die von der eigenen Java-Bean benötigt werden, wird das .jar-File zunächst der Library hinzugefügt (Projects-Fenster, Libraries, rechte Maustaste: Add JAR/Folder).
  • Es wird im weiteren Verlauf häufig vorkommen, dass an dieser Stelle dem Projekt zusätzliche Klassenbibliotheken bekannt gemacht werden müssen, sei es als Grundlage für weitere GUI-Komponenten, für Java3D, RxTx usw.
  • Man sieht in dem Library-Ordner auch, dass die Standard Libraries zu JDK 1.6 bereits eingefügt sind und welche dies sind.
Dem Projekt Bibliotheks-Klassen hinzufügen.

Bild 0-7: Dem Projekt Bibliotheks-Klassen hinzufügen.

Projektlibrary nach Hinzufügen von DoubleParameterBean.jar

Bild 0-8: Projektlibrary nach Hinzufügen von DoubleParameterBean.jar

  • Jetzt erst wird DoubleParameterBean.jar über den Palette-Manager (rechte Maustaste im Palette-Fenster, add from JAR) der Palette in der Kategorie "Beans" hinzugefügt.
  • Man sieht unten, dass nun auch das Icon der neuen Java-Bean zu sehen ist.
Palette-Fenster nach Hinzufügen von DoubleParameterBean.jar.

Bild 0-9: Palette-Fenster nach Hinzufügen von DoubleParameterBean.jar.

  • Für die neue Anwendung werden drei DoubleParameterBean-Objekte in das Fenster gezogen und passend positioniert und dimensioniert.
  • Beim Öffnen der Property-Fenster sieht man, dass diese nun wesentlich übersichtlicher sind.
  • Am oberen Rand ist immer der automatisch vergebene Objektname zu sehen.
  • Dieser kann auch noch geändert werden, wenn man mit der rechten Maustaste im Designfesnter auf das zu ändernde Objekt geht (Change Variable Name).
  • Da alle in das Fenster hineingezogenen Objekte auch per automatisch erstelltem Code dort erstellt werden und auch alle Ereignismethoden auf der Ebene des Fensters ggf. von NetBeans-IDE generiert werden, kann innerhalb dieser Methoden dann auch auf jedes der hineingezogenen Objekte unter dem im Property-Fenster zu sehenden Objektname zugegriffen werden.
  • Wir wählen über die jeweiligen Property-Fenster als ID der drei Elemente: 1.1, 1.2, 1.3 und die Bezeichnungen Zahl1, Zahl2, Zahl1+Zahl2:
Festlegen der Attribute über das Property-Fenster.

Bild 0-10: Festlegen der Attribute über das Property-Fenster.

Funktionalität über NetBeans-IDE hinzufügen

  • Da im Moment das Standard-JFrame benutzt wird, gibt es hier nun keine vorgefertigte Listener-Methode.
  • Satt dessen wird in jedem der ersten beiden Elemente (1.1 und 1.2 bzw. Zahl1 und Zahl2) eine Listener-Methode ergänzt, die reagiert, wenn sich der Wert in dem jeweiligen Element ändert.
  • Diese Methode wird von NetBeans-IDE automatisch ergänzt, wenn man mit der rechten Maustaste im Design-Fenster auf das jeweilige Objekt geht und dort bei Events in unserem Fall PropertyChange auswählt.
  • Daraufhin wird uns der entsprechende Quellcode-Bereich angezeigt, den wir passend ergänzen:
Automatisches Generieren der Property-Changed-Methode durch entsprechende Event-Auswahl.

Bild 0-11: Automatisches Generieren der Property-Changed-Methode durch entsprechende Event-Auswahl.

Von Hand ergänzter Code: Was ist zu tun, wenn sich bei Objekt doubleParameterBean1 ein PropertyChanged-Ereignis auftritt?

Bild 0-12: Von Hand ergänzter Code: Was ist zu tun, wenn sich bei Objekt doubleParameterBean1 ein PropertyChanged-Ereignis auftritt?

  • Der gleiche Code muß auch für doubleParameterBean2 erzeugt werden, damit Feld 3 auch dann geändert wird, wenn bei Feld 2 eine Änderung auftritt.
Insgesamt von Hand ergänzter Code in den automatisch erzeugten Methoden private void doubleParameterBean1PropertyChange(java.beans.PropertyChangeEvent evt) und private void doubleParameterBean2PropertyChange(java.beans.PropertyChangeEvent evt).

Bild 0-13: Insgesamt von Hand ergänzter Code in den automatisch erzeugten Methoden private void doubleParameterBean1PropertyChange(java.beans.PropertyChangeEvent evt) und private void doubleParameterBean2PropertyChange(java.beans.PropertyChangeEvent evt).

  • Jetzt ist noch...
  • die Main-Methode zu ergänzen,
  • die Größe des Fensters zu setzen (Property-Fenster von Fenster, minimumSize),
  • das Projekt zu kompilieren mit Build
  • und zu starten mit run:
Ergänzte Main-Klasse.

Bild 0-14: Ergänzte Main-Klasse.

Einstellen von minimumSize mit 500x500 Pixeln.

Bild 0-15: Einstellen von minimumSize mit 500x500 Pixeln.

IDE Log File zum Build-Vorgang F11.

Bild 0-16: IDE Log File zum Build-Vorgang F11.

Testlauf der Anwendung über Run Main Project F6.

Bild 0-17: Testlauf der Anwendung über Run Main Project F6.

bean007_Funktionalitaet_in_NetBeans.zip - Download des oben beschriebenen NetBeans-IDE-Projektes.