15.25 Bäume mit JTree-Objekten
Um Baumansichten ähnlich der Explorer-Ansicht in Swing zu realisieren, lässt sich die Komponente JTree einsetzen. Für sie gibt es unter dem AWT keinen Ersatz. Die Daten eines Baums sitzen in einem Modell, welches die Schnittstelle TreeModel implementiert. Das notwendige Modell ist sehr einfach und bietet keine Veränderungsfunktionen. Die Daten, die das Modell liefert, müssen lediglich die Aussage treffen, ob sie ein Blatt oder eine Wurzel darstellen und wo sie in der Baumverästlung liegen. Eine weitere bedeutende Schnittstelle ist TreeNode. Sie repräsentiert einen Eintrag im Baum. Die konkrete Klasse DefaultMutableTreeNode ist eine Implementierung der Schnittstelle MutableTreeNode und TreeNode. Sie stellt einen Standardbaumknoten dar, der universell eingesetzt werden kann. Mit der add()-Methode eines Objekts vom Typ DefaultMutableTreeNode kann eine Baumstruktur geschaffen werden.
Hier klicken, um das Bild zu Vergrößern
Listing 15.34 JTreeDemo.java
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.event.*;
public class JTreeDemo
{
public static void main( String args[] )
{
JFrame frame = new JFrame();
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
DefaultMutableTreeNode root = new DefaultMutableTreeNode( "Wurzel" );
for ( int ast = 0; ast < 4; ast++ )
{
DefaultMutableTreeNode node = new DefaultMutableTreeNode( "Knoten " + ast );
root.add( node );
for ( int blatt = 1; blatt < 4; blatt++ )
node.add( new DefaultMutableTreeNode("Blatt " + (ast*3+blatt )) );
}
JTree tree = new JTree( root );
JScrollPane scrollTree = new JScrollPane( tree );
frame.getContentPane().add( scrollTree );
frame.pack();
frame.setVisible( true );
}
}
15.25.1 Selektionen bemerken
Eine Benutzeraktion auf einem Baum wird über ein TreeSelectionListener beachtet. Dieser Listener wird an das Modell des Baums gehängt. Dazu dient die Methode addTreeSelectionListener(). Der Parameter ist vom Typ TreeSelectionListener. Die Listener-Schnittstelle definiert die Methode valueChanged(), über die wir das angewählte Element erfragen können. Interessieren wir uns für den Pfad des Blatts, kann die Methode getNewLeadSelectionPath() auf dem TreeSelectionEvent genutzt werden. Das Ereignis wird der valueChanged()-Methode übergeben. Das Ergebnis der Pfad-Anfragemethoden ist ein TreePath-Objekt. Dies gibt den Pfad von der Wurzel des Baums zu einem bestimmten Knoten an. Wenn es die Selektion betrifft, dann bekommen wir darüber Information zum angewählten Objekt.
Beispiel tree sei ein JTree-Objekt. Dann können wir an das zugehörige Modell einen SelectionListener hängen.
|
tree.getSelectionModel().addTreeSelectionListener(
new TreeSelectionListener()
{
public void valueChanged( TreeSelectionEvent e )
{
TreePath path = e.getNewLeadSelectionPath();
System.out.println( path );
}
}
);
Tipp Eine JTree besitzt eine Standardbreite, die in einigen Fällen stört. Das ist zum Beispiel der Fall, wenn der Baum in einem JSplitPane sitzt. Soll der Bereich mit dem Baum auf Null weggeschoben werden, so lässt JSplitPane dies nicht zu. Das liegt daran, dass der Baum den Platz einnimmt, den er benötigt, und die JSplitPane auf die kleinste Darstellung des Baums hört. Die Lösung für das Problem ist, dem Baum mit setMinimumSize() eine Minimalgröße von 0 zu geben. Dann lässt sich der JTree ganz zusammenschieben.
jTree.setMinimumSize( new Dimension() );
|
|