Galileo Computing < openbook >
Galileo Computing - Professionelle Buecher. Auch fuer Einsteiger.
Galileo Computing - Professionelle Buecher. Auch fuer Einsteiger.


Java ist auch eine Insel von Christian Ullenboom
Buch: Java ist auch eine Insel (Galileo Computing)
gp Kapitel 22 Komponenten durch Bohnen
gp 22.1 Grundlagen der Komponententechnik
gp 22.1.1 Brauchen wir überhaupt Komponenten?
gp 22.1.2 Visuelle und nichtvisuelle Komponenten
gp 22.1.3 Andere Komponententechnologien oder: Was uns Microsoft brachte
gp 22.2 Das JavaBeans Development Kit (BDK)
gp 22.2.1 Eine Beispielsitzung im BDK
gp 22.2.2 Verknüpfungen zwischen Komponenten
gp 22.2.3 Beans speichern
gp 22.3 Die kleinste Bohne der Welt
gp 22.4 Jar-Archive für Komponenten
gp 22.5 Worauf JavaBeans basieren
gp 22.6 Eigenschaften
gp 22.6.1 Einfache Eigenschaften
gp 22.6.2 Boolesche Eigenschaften
gp 22.6.3 Indizierte Eigenschaften
gp 22.7 Ereignisse
gp 22.7.1 Multicast und Unicast
gp 22.7.2 Namenskonvention
gp 22.8 Weitere Eigenschaften
gp 22.8.1 Gebundene Eigenschaften
gp 22.8.2 Anwendung von PropertyChange bei AWT-Komponenten
gp 22.8.3 Veto-Eigenschaften. Dagegen!
gp 22.9 Bean-Eigenschaften anpassen
gp 22.9.1 Customizer
gp 22.10 Property-Editoren
gp 22.11 BeanInfo
gp 22.12 Beliebte Fehler


Galileo Computing

22.6 Eigenschaftendowntop

Über die Eigenschaften einer Bean lassen sich zur Laufzeit Parameter übergeben. Das Verändern der Eigenschaften geschieht über normale Methoden, die besonders benannt sind. Diese Namensgebung nennt sich auch Design-Pattern. Der Name hat jedoch nichts mit den Entwurfsmustern aus der objektorientierten Softwareentwicklung gemeinsam. Ein Design-Pattern für einfache Attribute schreibt etwa setXXX()- und getXXX()-Methoden vor.

JavaBeans unterscheidet vier Arten von Eigenschaften:

gp Einfache Eigenschaften. Diese verdeutlichen wir uns an der Eigenschaft »Text« einer AWT-Label-Komponente. Sie bietet die Methoden getText() und setText() an.
gp Indizierte/Indexierte Eigenschaften (engl. indexed properties). Sie werden eingesetzt, falls mehrere gleiche Eigenschaften aus einem Array verwaltet werden. So lassen sich Felder gleichen Datentyps verwalten.
gp Gebundene Eigenschaften (engl. bound properties). Ändert eine Komponente ihr Verhalten, dann kann sie angemeldete Interessenten (Listener) informieren.
gp Eigenschaft mit Vetorecht (engl. veto properties, auch constraint properties beziehungsweise eingeschränkte Eigenschaften genannt). Ihre Benutzung ist in den Fällen angebracht, wo eine Bean Eigenschaften ändern möchte, andere Beans aber dagegen sind und ihr Veto einlegen.

Die Eigenschaften der Komponente können primitive Datentypen, aber auch komplexe Klassen sein. Der Text einer Schaltfläche ist ein einfacher String, eine Sortierstrategie in einem Sortierprogramm ist jedoch ein komplexes Objekt. Ein Application-Builder kann alle primitiven Datentypen sowie String-, Font- und Color-Objekte anzeigen. Bei komplexen Eigenschaften müssen wir sicherstellen, dass der Application-Builder auch die Eigenschaften editieren kann. Werden die komplexeren Eigenschaften genutzt, so muss ein Editor für die entsprechenden Klassen definiert werden.


Galileo Computing

22.6.1 Einfache Eigenschaftendowntop

Für die einfachen Eigenschaften muss nur ein Paar von setXXX()- und getXXX()-Methoden eingesetzt werden. Der Zugriff auf eine Objektvariable wird also über Funktionen geregelt. Dies hat den Vorteil, dass ein Zugriffsschutz und weitere Überprüfungen eingerichtet werden können. Soll eine Eigenschaft nur gelesen werden (weil sie sich zum Beispiel regelmäßig automatisch aktualisiert), dann müssen wir die setXXX()-Methode nicht implementieren. Genauso gut können wir Werte, die außerhalb des erlaubten Wertebereichs unserer Applikation liegen, prüfen und ablehnen. Dazu kann eine Methode eine Exception auslösen.

Allgemein sieht dann die Signatur der Methoden für den Eigenschaftentyp PropertyTyp so aus:

public <PropertyTyp> getXXX()
public void setXXX( <PropertyTyp> wert )

Beispiel Die Implementierung für eine Komponente, die eine Farbe besitzt, könnte so aussehen:
private Color color;
public Color getColor()
{
  return color;
}
public void setColor( Color color )
{
  this.color = color;
}


Galileo Computing

22.6.2 Boolesche Eigenschaftendowntop

Falls eine getXXX()-Methode nur einen Wahrheitswert zurückgibt, ermöglicht eine isXXX()-Methode eine Vereinfachung. Im Prinzip ist dies aber nur eine andere Schreibweise für getXXX(). Der allgemeine Typ ist:

public boolean isXXX()
public void setXXX( boolean wert )

Beispiel Nehmen wir an, unsere Komponente besäße die Eigenschaft visible für die Sichtbarkeit einer Komponente. Dann können wir Folgendes schreiben:
private boolean visible;
public boolean getVisible()
{
  return visible;
}
public boolean isVisible()
{
  return visible;
}

In diesem Beispiel hört sich die isXXX()-Methode auch etwas besser an. Hübscher wäre getVisibility().


Galileo Computing

22.6.3 Indizierte Eigenschaftentoptop

Falls eine Bean nur eine einfache Eigenschaft wie eine primitive Variable besitzt, so besitzen die getXXX()-Methoden keinen Parameter und genau einen Rückgabewert. Der Rückgabewert hat den gleichen Datentyp wie die interne Eigenschaft. Die setXXX()-Methode besitzt genau einen Parameter des Datentyps dieser Eigenschaft. Eine setXXX()-Methode hat keinen expliziten Rückgabewert. Wenn nun kein atomarer Wert, sondern ein Feld von Werten intern gespeichert ist, dann müssen wir Zugriff auf bestimmte Werte bekommen. Daher wird den setXXX()- und getXXX()-Methoden als zusätzlicher Parameter ein Index übergeben.

public <PropertyTyp> [] getXXX()
public <PropertyTyp> getXXX( int index )
public void setXXX( <PropertyTyp> [] werte )
public void setXXX( <PropertyTyp> wert, int index )

Beispiel Speichert eine Komponente für einen Farbverlauf eine Anfangs- und Endfarbe, so sehen wir an der Implementierung, wie sich indexierte Eigenschaften anwenden lassen.

private Color colors[] = new Color[2];
public Color[] getColors()
{
  return colors;
}
public Color getColor( int index )
{
  switch ( index )
  {
    case 0:
    case 1: return colors[index];
 }
 return null;
}
public void setColors( Color colors[] )
{
  if ( colors != null )
    this.colors = (Color[])colors.clone();
}
public void setColors( Color color, int index )
{
  if ( index >= 0 && index <= 1 )
    this.colors[index] = color;
}

Wir lehnen einen falschen Index bei den setXXX()-Methoden einfach ab. Eine andere Lösung ist, diesen falschen Index mit ArrayIndexOutOfBounds zu quittieren.

Eine List-Box beim AWT wäre ein typisches Beispiel für eine indexierte Eigenschaft, doch die AWT-Entwickler haben keine indizierte Methode setItems() vorgesehen. Intern muss Zugriff auf ein Element gestattet werden, und die Elemente sollten sich abfragen lassen. Doch stattdessen gibt es eine Methode mit dem Namen add(). Zum Auslesen bietet »List« jedoch getItems(); warum dann setItems() fehlt, ist fragwürdig. Daher ist die Liste unter dem AWT leider kein gutes Beispiel für eine GUI-Bean.





Copyright (c) Galileo Press GmbH 2004
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press GmbH, Gartenstraße 24, 53229 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de