Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger

 << zurück
Java ist auch eine Insel von Christian Ullenboom
Programmieren für die Java 2-Plattform in der Version 5
Java ist auch eine Insel

Java ist auch eine Insel
5., akt. und erw. Auflage
1454 S., mit CD, 49,90 Euro
Galileo Computing
ISBN 3-89842-747-1
gp Kapitel 22 Komponenten durch Bohnen
  gp 22.1 Grundlagen der Komponententechnik
    gp 22.1.1 Brauchen wir Komponenten überhaupt?
    gp 22.1.2 Visuelle und nichtvisuelle Komponenten
    gp 22.1.3 Komponenten-Technologien von Microsoft
  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 Eigenschaftedowntop

Über die Eigenschaften einer Bean lassen sich zur Laufzeit Argumente übergeben. Das Verändern der Eigenschaften geschieht über normale Methoden, die besondere Namen tragen. 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 jenen Fällen angebracht, in denen 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, muss ein Editor für die entsprechenden Klassen definiert werden.


Galileo Computing

22.6.1 Einfache Eigenschaften  downtop

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), 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 folgendermaßen aus:

gp  public <PropertyTyp> getXXX()
gp  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 Eigenschaften  downtop

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:

gp  public boolean isXXX()
gp  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 Eigenschaften  toptop

Falls eine Bean nur über eine einfache Eigenschaft wie eine primitive Variable verfügt, so weisen die getXXX()-Methoden keinen Parameter und genau einen Rückgabewert auf. 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 erwarten die setXXX()- und getXXX()-Methoden im zusätzlichen Parameter einen Index.

gp  public <PropertyTyp> [] getXXX()
gp  public <PropertyTyp> getXXX( int index )
gp  public void setXXX( <PropertyTyp> [] werte )
gp  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 colorint 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. Stattdessen gibt es eine Methode namens add(). Zum Auslesen bietet »List« jedoch getItems(); warum dann setItems() fehlt, ist unklar. Daher ist die Liste unter dem AWT leider kein gutes Beispiel für eine GUI-Bean.

 << zurück




Copyright © Galileo Press GmbH 2005
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, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de