Weitere aktuelle Java-Titel finden Sie bei dpunkt.
 Inhaltsverzeichnis   Auf Ebene Zurück   Seite Zurück   Seite Vor   Auf Ebene Vor   Eine Ebene höher   Index


14.4.5

Beispiel: Preference-Browser


Am Beispiel eines Preferences-Browsers wird im Folgenden die Navigation und Veränderung einzelner Knoten in der Hierarchie diskutiert. Ähnlich dem Windows-Registry-Editor zeigt der Preference-Browser die verfügbaren Knoten an und erlaubt das Hinzufügen und Löschen von Knoten und Einstellungen. Außerdem unterstützt der Browser Import und Export von Einstellungen im XML-Format, wie es im letzten Abschnitt beschrieben wurde.

Abbildung 14.3: Ein Preference-Browser in Java
Abbildung 14.3

Zum Aufbau einer Baumstruktur muss man ausgehend von beiden Wurzelknoten rekursiv alle gespeicherten Einstellungen traversieren. Dies wird im Beispiel in folgender rekursiven Methode gemacht:

  protected void buildPrefTree(Preferences prefs,
                            DefaultMutableTreeNode parent)
                            throws BackingStoreException {
    // Einstellungen einem neuen TreeNode hinzufügen ...
    DefaultMutableTreeNode node =
                      new DefaultMutableTreeNode(prefs);
    parent.add(node);  // ... und in den Baum hängen
    // Namen der Kind-Knoten ermitteln
    String[] childs = prefs.childrenNames();
    for(int i=0; i < childs.length; i++) {
      // Kind-Knoten abfragen ..
      Preferences child = prefs.node(childs[i]);
      // und rekursiv in den neuen TreeNode einfügen
      buildPrefTree(child, node);
    }
  }

Die Methode bekommt ein Preferences-Exemplar und einen DefaultMutableTreeNode übergeben, der zum Aufbau eines JTree benutzt wird. Für das übergebene Preferences-Exemplar wird zunächst ein TreeNode erzeugt und in die bestehende Baumstruktur eingehängt. Danach werden die Namen der Kindknoten über childrenNames() ermittelt und anschließend mit node() abgerufen. Für jeden Kindknoten erfolgt daraufhin wiederum ein Aufruf der Methode. Um den kompletten Baum aufzubauen, wird die Methode folgendermaßen benutzt:
  rootNode = new DefaultMutableTreeNode("Preferences");
  buildPrefTree(Preferences.systemRoot(), rootNode);
  buildPrefTree(Preferences.userRoot(), rootNode);
buildPrefTree() wird für jeden Wurzelknoten einmal aufgerufen, wobei die Teilbäume demselben TreeNode hinzugefügt werden.

Erstellen und Löschen von Knoten wird entweder über das »Edit«-Menü oder über das Kontextmenü realisiert. Dabei wird zunächst der Knoten im Baum selektiert und anschließend der entsprechende Menüeintrag gewählt. Das zuständige Preferences-Exemplar kann so einfach über seine Position im Baum lokalisiert werden. Über die Methoden removeNode() bzw. node() können dabei existierende Knoten gelöscht bzw. neue Knoten angelegt werden:
  Preferences prefs;
  // Ermitteln des Knotens
  prefs = Preferences.systemRoot().node("/de/dpunkt/TestNode");
  // Löschen des Knotens
  prefs.removeNode();
Wenn man nach dem Aufruf von removeNode() versucht, auf Inhalte des Preferences-Exemplars zuzugreifen, wird eine IllegalStateException ausgelöst.

Das Umbenennen existierender Knoten wird von dem Preferences-API derzeit nicht unterstützt. Zur Realisierung dieser Aufgabe muss man statt dessen einen neuen Knoten mit neuem Namen erzeugen, alle Kindknoten und Einstellungen dorthin kopieren und den Originalknoten danach löschen.

Wenn man einen Einstellungsknoten in der Beispielanwendung wählt, werden in der Tabelle auf der rechten Seite alle zugehörigen Schlüssel-Wert-Paare angezeigt. Über die Methode keys() werden die Namen der Schlüssel ermittelt, deren Wert über die get()-Methoden abgefragt werden. Folgendes Beispiel zeigt, wie man alle Einstellungen in einem Knoten ausgeben kann:
  Preferences prefs;
  ...
  String[] keys = prefs.keys();
  for(int i=0; i < keys.length; i++) 
    System.out.println(prefs.get(keys[i]);
Mit der remove()-Methode werden einzelne Schlüssel wieder aus dem Einstellungsknoten entfernt:
  Preferencs prefs;
  ...
  prefs.remove("font-size");
clear() ermöglicht hingegen das Löschen aller Einstellungen eines Knotens.

Wenn mehrere Anwendungen Änderungen an den Einstellungen durchführen, kann sich die Möglichkeit der Aktualisierung als nützlich erweisen. Diese Funktion wird von der Beispielanwendung über das Datei-Menü unterstützt. Die eigentliche Arbeit wird von der Methode sync() übernommen, die ebenfalls in der Klasse Preferences definiert ist. Beim Aufruf werden alle in den Preferences-Knoten zwischengespeicherten Einstellungsdaten verworfen und neu vom zugrundeliegenden Persistenz-Mechanismus geladen.

Die Verwendung von sync() ist allerdings nur zur Synchronisation von Einstellungen zwischen verschiedenen Anwendungen zu empfehlen. Wenn innerhalb einer Anwendung an verschiedenen Stellen auf Änderungen an den Einstellungen reagiert werden soll, kann man die relevanten Klassen bei den entsprechenden Preferences-Exemplaren als NodeChangeListener PreferencesChangeListener registrieren. Während NodeChangeListener beim Hinzufügen oder Entfernen von Kindknoten informiert wird, ermöglicht ein PreferencesChangeListener die Reaktion auf das Hinzufügen, Ändern und Löschen einzelner Schlüssel-Wert-Paare in einem Knoten. Im Unterschied zu sync() sind die geänderten Einstellungen sofort in der Anwendung verfügbar, durch die Listener können lediglich andere Klassen synchron über die Änderung informiert werden. Bei externen Änderung hingegen ist keine Benachrichtigung möglich, und die zwischengepufferte Knoten müssen explizit mit sync() aktualisiert werden.

Material zum Beispiel


 Inhaltsverzeichnis   Auf Ebene Zurück   Seite Zurück   Seite Vor   Auf Ebene Vor   Eine Ebene höher   Index

Copyright © 2002 dpunkt.Verlag, Heidelberg. Alle Rechte vorbehalten.