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


8.6.10

JTree



Abbildung 8.43: JTree
Abbildung 8.43

Ein JTree stellt eine Baumstruktur dar. Man unterscheidet dabei Knoten (Nodes), die weitere Unterelemente haben können, und Blätter (Leafs), die keine Unterelemente haben. Blätter sind die letzten Elemente in einem Ast und haben dementsprechend keine Kinder (Children).

Abbildung 8.44: FileBrowser auf Grundlage des JTrees mit Drag-and-Drop innerhalb des Baums
Abbildung 8.44

Neben den Daten, die als TreeNodes abgelegt sind, ist noch die Klasse TreePath interessant. Um einen Pfad zu einem Knoten eindeutig zu identifizieren (bspw. um diesen sichtbar zu machen oder den Ast zu entfalten), wird ein Exemplar der Klasse durch Angabe des gesamten Pfades als Array von Knoten im Konstruktor erzeugt und an die entsprechende Methode übergeben.

Model

Die Grundlage des JTree ist der Wurzelknoten (root), welcher als javax.swing.tree.TreeNode definiert ist. In diesem TreeNode sind typischerweise alle Daten hierarchisch einsortiert.

Es gibt neben dem Interface TreeNode eine editierbare Erweiterung, den MutableTreeNode. Die einzige direkte, von Swing zur Verfügung gestellte Implementierung, ist javax.swing.tree.DefaultMutableTreeNode, welches zusätzlich ein anwenderdefiniertes Objekt assoziiert haben kann (getUserObject() bzw. setUserObject(Object)).

  DefaultMutableTreeNode root = 
    new DefaultMutableTreeNode("Root");
  root.add(
    new DefaultMutableTreeNode("Child 1"));
  root.add(
    new DefaultMutableTreeNode("Child 2"));
  JTree tree = new JTree(root);

Als Erweiterung dazu bietet die Klasse JTree.DynamicUtilTreeNode die Möglichkeit, aus einem Objekt-Array, aus einer java.util.Hashtable oder aus einem java.util.Vector den Baum aufzubauen. Die Verwendung empfiehlt sich, wenn man nicht mit TreeNodes direkt arbeiten will. Die entsprechenden DefaultMutableTreeNodes werden hier bei Bedarf angelegt.

  // Zeigt einen Baum der Form
  // +-root
  //   +- Node 1
  //   |  +- Leaf 1
  //   |  +- Leaf 2
  //   +- Node 2
  //      +- Leaf 3
  Hashtable firstLevel = new Hashtable();
  Vector secondLevel= new Vector();
  secondLevel.addElement("Leaf 1");
  secondLevel.addElement("Leaf 2");
  firstLevel.put("Node 2", new String[] "Leaf3");
  firstLevel.put("Node 1", secondLevel);
  getContentPane ().add(new JTree (
    new JTree.DynamicUtilTreeNode ("root", firstLevel)));

Die Standardimplementierung des dem JTree zugrunde liegenden Model javax.swing.tree.TreeModel ist die Klasse javax.swing.tree.DefaultTreeModel, welches hilfreiche Funktionen bietet wie bspw. diverse Funktionen, um Änderungen bekanntzugeben.

Bei großen Bäumen oder falls aufgrund der Performance Äste erst nachgeladen werden sollen, wenn diese angefordert (sichtbar) werden, empfiehlt es sich, die folgenden Methoden des TreeModel zu überschreiben:

  public Object getChild(Object parent, int index)
  public int getChildCount(Object parent)

Fragt der JTree nach einem neuen Ast, kann der Programmierer erst dann die entsprechenden Daten laden.

Renderer

Der javax.swing.tree.TreeCellRenderer verhält sich grundsätzlich ähnlich wie der des JTables.

Die Klasse javax.swing.tree.DefaultTreeCellRenderer bildet die Standardimplementierung, bei der die Grafiken für die Ordner und Blätter auch ohne Ableitung gesetzt werden können. Wer allerdings verschiedene Grafiken für einen Ordner oder ein Blatt kontextbezogen verwenden will, setzt in der Methode getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus) das Icon der Superklasse (die von einem JLabel abgeleitet ist) auf das gewünschte Bild.

Editor

Der javax.swing.tree.TreeCellEditor und seine Standardimplementierung javax.swing.tree.DefaultTreeCellEditor verhalten sich ähnlich wie die Implementierung für eine JTable.

Im Gegensatz zur JTable wird aber auch beim Editieren typischerweise eine Grafik für den Knoten oder das Blatt mit angezeigt. Daher muss beim Konstruktor des DefaultTreeCellEditor der passende Renderer mit angegeben werden.


 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.