Java Beans Grundlagen - hs-weingarten.dekeller/Downloads/javabeans.pdf · Was bringen Java Beans?...

15
Java Beans Grundlagen • Vorwort • Was bringen Java Beans? • Wie werden Java Beans erstellt? • Wie benutzt man Java Beans? Überblick über den Vortrag: Christian Wilhelm

Transcript of Java Beans Grundlagen - hs-weingarten.dekeller/Downloads/javabeans.pdf · Was bringen Java Beans?...

Page 1: Java Beans Grundlagen - hs-weingarten.dekeller/Downloads/javabeans.pdf · Was bringen Java Beans? • Wiederverwendbarkeit von Programmcode • Einheitliches Design von Oberflächen

Java Beans Grundlagen

• Vorwort• Was bringen Java Beans?• Wie werden Java Beans erstellt?• Wie benutzt man Java Beans?

Überblick über den Vortrag:

Christian Wilhelm

Page 2: Java Beans Grundlagen - hs-weingarten.dekeller/Downloads/javabeans.pdf · Was bringen Java Beans? • Wiederverwendbarkeit von Programmcode • Einheitliches Design von Oberflächen

Vorwort:

In meiner Projektarbeit hatte ich es mir zum Ziel gesetzt ein Bean zur Datums- und Zeitauswahl mit automatischer Validierung zu realisieren:

Aus den daraus gewonnen Erfahrungen verfasste ich in Word ein „How-To make a Bean“ Dokument, indem die grundlegenden Beaneigenschaften mit Codebeispielen enthalten sind. Dieser Vortrag basiert auf diesem How-To.

Das Mini How-To steht im Word Format zum download bereit unter:www.ghent.de/beans.doc

Page 3: Java Beans Grundlagen - hs-weingarten.dekeller/Downloads/javabeans.pdf · Was bringen Java Beans? • Wiederverwendbarkeit von Programmcode • Einheitliches Design von Oberflächen

Was bringen Java Beans?

• Wiederverwendbarkeit von Programmcode• Einheitliches Design von Oberflächen• möglicher Verkauf

Selbstgeschriebene Beans:

Fremderworbene Beans:

• meist komplexer Funktionsumfang• meist fehlerfreier Code• teure und langwierige Eigenentwicklung entfallen

Page 4: Java Beans Grundlagen - hs-weingarten.dekeller/Downloads/javabeans.pdf · Was bringen Java Beans? • Wiederverwendbarkeit von Programmcode • Einheitliches Design von Oberflächen

Wie werden Java Beans erstellt?

Da dieser Bereich der Schwerpunkt des Vortrages darstellt, möchte ich hiererneut eine kurze Gliederung der behandelten Themen aufführen:

1. Die BeanInfo Klasse2. Der Property Editor3. Der Customizer4. Eventhandling bei Java Beans5. Erzeugen eines JAR Archivs

Page 5: Java Beans Grundlagen - hs-weingarten.dekeller/Downloads/javabeans.pdf · Was bringen Java Beans? • Wiederverwendbarkeit von Programmcode • Einheitliches Design von Oberflächen

Beans sind ganz normale Java Programme, die über “Setter” und “Getter” Funktionen ihre Parameter nach außen geben. Die eigentliche Beanfunktionalität kommt durch eine Klasse, die so heißt, wie die Beanklasse mit der Ergänzung: „BeanInfo”.

In meinem Fall:Beanklasse: DateField.classBeanInfoklasse: DateFieldBeanInfo.class

Die BeanInfo Klasse (1/2)

Diese BeanInfoklasse wird von java.beans.SimpleBeanInfo abgeleitet.Durch Überschreiben der

public Image getIcon(int iconType)Methode, wird das Icon des Beans, das später in der Entwicklungs-umgebung das Bean selbst symbolisiert, definiert.

Page 6: Java Beans Grundlagen - hs-weingarten.dekeller/Downloads/javabeans.pdf · Was bringen Java Beans? • Wiederverwendbarkeit von Programmcode • Einheitliches Design von Oberflächen

Die BeanInfo Klasse (2/2)

Um die Parameter über Setter und Getter aus der Beanklasse in der Entwicklungs-umgebung anpassen zu können, ist es nötig die

public PropertyDescriptor[] getPropertyDescriptors()Methode zu überschreiben und die Setter und Getter zusammen mit der Eigenschaft-beschreibung in einem PropertyDescriptor Array zurückzugeben. Um zu zeigen, wiePropertyDescriptoren initialisiert werden, hier ein Beispiel:

new PropertyDescriptor("dateformat",DateField.class,"getFormat","setFormat")

Durch das Überschreiben der public PropertyDescriptor[] getPropertyDescriptors()Funktion besitzt das Bean nun nur noch die Eigenschaften, die mit Hilfe des PropertyDescriptor[] zurückgegeben wurden.Um wieder alle Eigenschaften in der Entwicklungsumgebung anzeigen zu können,bedarf es der public BeanInfo[] getAdditionalBeanInfo() mit der die BeanInfo eineroder mehrerer anderer Klassen (meist die Basisklasse der Beanklasse) zurückgegebenwird.Das Ergebnis sind alle normalen Eigenschaften des Beans plus die selbst erzeugten.

Page 7: Java Beans Grundlagen - hs-weingarten.dekeller/Downloads/javabeans.pdf · Was bringen Java Beans? • Wiederverwendbarkeit von Programmcode • Einheitliches Design von Oberflächen

Der Property Editor (1/2)

Mit Hilfe der BeanInfo Klasse sind nur relativ einfache Eigenschaftsänderungen, wiedie Übergabe von Parametern oder eine True/False Auswahl bei boolean Datentypenmöglich.Um unterschiedliche Auswahlmöglichkeiten zur Verfügung zu stellen, wird eineigener Property Editor benötigt.

Diese Klasse wird java.beans.PropertyEditorSupport abgeleitet. In dieser Klasse werden die Methoden

public String getAsText()public void setAsText(String Text)

überschrieben.Um das Ganze dann anzeigen zu können, muss in der BeanInfo Klasse noch die

Methode setPropertyEditorClass(class PropertyEditor) des

PropertyDescriptionObjekts gesetzt werden.Ein mögliches Ergebnis könnte folgendermaßen aussehen:

Page 8: Java Beans Grundlagen - hs-weingarten.dekeller/Downloads/javabeans.pdf · Was bringen Java Beans? • Wiederverwendbarkeit von Programmcode • Einheitliches Design von Oberflächen

Falls man noch mehr Flexibilität benötigt, muss man dann anstelle der Methoden“setAsText” und “getAsText” die Methoden: isPaintable() mit true und dann die paintValue(Graphics g, Rectangle box) Methode mit den gewünschten Änderungen überschreiben. Hiermit sind dann auch grafische Effekte der Eigenschaft möglich, wie das Ändernder Hintergrund- oder der Vordergrundfarbe:

Der Property Editor (2/2)

Page 9: Java Beans Grundlagen - hs-weingarten.dekeller/Downloads/javabeans.pdf · Was bringen Java Beans? • Wiederverwendbarkeit von Programmcode • Einheitliches Design von Oberflächen

Der Customizer (1/2)

Mit einem Bean Customizer kann man mehrere (oder auch alle) spezifischenEigenschaften eines Beans einstellen. Dies ist vor allem von Vorteil, wenn man komplexe Zusammenhänge innerhalb eines Beans hat. Zum Beispiel, das Eigenschaft A nur erscheint, wenn Eigenschaft B zuvor angewählt wurde.Um den Customizer aufzurufen, klickt man im JBuilder mit der rechten Maustaste im Designbaum, auf das Bean und wählt hier „Customizer“.Ich bediente mich des Customizers um meine Eigenschaften einfach und übersichtlich darzustellen. Zusätzlich versah ich den Customizer mit einem HilfeButton, der die in meinem Bean verwendbaren Formatzeichen auflistet:

Page 10: Java Beans Grundlagen - hs-weingarten.dekeller/Downloads/javabeans.pdf · Was bringen Java Beans? • Wiederverwendbarkeit von Programmcode • Einheitliches Design von Oberflächen

Der Customizer (2/2)

Um einen Customizer zu programmieren, verwendet man eine ganz normale Klasse,die man von einem JPanel ableitet und das Interface Customizer implementiert. Diese Klasse kann man nun wie gewohnt mit grafischen Elementen gestalten unddesignen. Sie sollte die Methode public void setObject (Object obj) überschreiben. In dieser Methode werden den Eigenschaften die Werte zugewiesen, die vielleicht schon teilweise mit den normalen Eigenschaften des JBuilders eingestellt wurden. Außerdem sollte man einen PropertyChangeListener implementieren. Durch diesen Listener werden nämlich die Properties aus der Propertyliste des JBuildersbenachrichtigt und erhalten ebenfalls die, im Customizer, gesetzten Eigenschaften.Dadurch werden inkonsistente Einstellungen verhindert. Um aus diesem JPanel dann einen Customizer zu machen, wird in der BeanInfo des Beans die Methode getBeanDescriptor() überschrieben und die Klasse des Customizer zurückgegeben

Page 11: Java Beans Grundlagen - hs-weingarten.dekeller/Downloads/javabeans.pdf · Was bringen Java Beans? • Wiederverwendbarkeit von Programmcode • Einheitliches Design von Oberflächen

Eventhandling bei Java Beans (1/3)

Das Eventhandling in einem Bean funktioniert genau gleich wie in normalen Java Programmen. Es muss nur sichergestellt werden, dass das Bean in seinen Eventhandlern das Event noch einmal feuert. Nur so ist es möglich, dass die Klasse, die das Bean implementiert hat, das Event bekommt und dann in dessen Eventhandlerspringt:

Programm mit Bean

Eventhandler

Bean

Eventhandler

Event

Page 12: Java Beans Grundlagen - hs-weingarten.dekeller/Downloads/javabeans.pdf · Was bringen Java Beans? • Wiederverwendbarkeit von Programmcode • Einheitliches Design von Oberflächen

Eventhandling bei Java Beans (2/3)Um diese Funktionalität zu gewährleisten, muss zu erst einmal der Standard-Listener entfernt werden:public synchronized void removeFocusListener(FocusListener l){super.removeFocusListener(l);if (focusListeners != null && focusListeners.contains(l)){

Vector v = (Vector) focusListeners.clone();v.removeElement(l);focusListeners = v;

}}

Anschliessend wird ein eigener Listener erzeugt:private transient Vector focusListeners;Dieser eigene Listener wird nun an das Bean geaddetpublic synchronized void addFocusListener(FocusListener l){super.addFocusListener(l);Vector v = focusListeners == null ? new Vector(2) : (Vector) focusListeners.clone();if (!v.contains(l)){

v.addElement(l);focusListeners = v;

}}

Page 13: Java Beans Grundlagen - hs-weingarten.dekeller/Downloads/javabeans.pdf · Was bringen Java Beans? • Wiederverwendbarkeit von Programmcode • Einheitliches Design von Oberflächen

Eventhandling bei Java Beans (3/3)

Um nun ein Event zu feuern, benötigt man noch die Funktion:protected void fireFocusLost(FocusEvent e){if (focusListeners != null){

Vector listeners = focusListeners;int count = listeners.size();for (int i = 0; i < count; i++){

((FocusListener) listeners.elementAt(i)).focusLost(e);}

}}

Diese Methode muss man nun im eigenen Eventhandler des Beans aufrufen um ein Event zu feuern:public void focusLost(FocusEvent e){

fireFocusLost(e);}Dabei übergibt man einfach das Event e.Nun reagiert das Bean wie jede andere Komponente auch auf die Events der Klasse, die es verwendet.

Page 14: Java Beans Grundlagen - hs-weingarten.dekeller/Downloads/javabeans.pdf · Was bringen Java Beans? • Wiederverwendbarkeit von Programmcode • Einheitliches Design von Oberflächen

Erzeugen eines JAR Archivs

Um das Bean nun transportabel zu machen, verwendet man einen ZipPacker, packt alle erzeugten Klassen in ein Archiv, fügt noch ein Verzeichnis„Meta-inf“ das wiederum eine Datei „Manifest.mf“ enthalten muss dazu undbenennt die Endung von .ZIP nach .JAR um.

Die „Manifest.mf“ ist eine Textdatei, die in unserem Falle genau dreiZeilen enthält:Die erste Zeile gibt die Version des Manifests an. In meinem Fall:

Manifest-Version: 1.0Anschließend folgt der vollqualifizierte Pfad zur Beanklasse innerhalb des JARs an (hierzu muss die Verzeichnisstruktur innerhalb des JARs berücksichtigt werden).Die dritte Zeile lautet einfach: Java-Bean = True

In meinem Fall sieht das Manifest folgendermaßen aus:

Manifest-Version: 1.0Name: DateField.DateField.classJava-Bean: True

Page 15: Java Beans Grundlagen - hs-weingarten.dekeller/Downloads/javabeans.pdf · Was bringen Java Beans? • Wiederverwendbarkeit von Programmcode • Einheitliches Design von Oberflächen

Wie benutzt man Java Beans?

Praktische Vorführung in JBuilder 5