WPP: Einführung in JAVA Thema: SWING Komponenten 2 Autor: André Palapies Inhalt: SWING Komponenten 2 1. JTable 1.1 Tabellenmodell 1.2 Spaltenmodell 1.3 Rendering der Zellen 1.4 Reaktion auf Ereignisse 2. JTree 2.1 Erzeugen eines Baumes Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 2 Inhalt: SWING Komponenten 2 2.2 Selektieren von Knoten 2.2.1 Konfiguration der Selektionsmöglichkeiten 2.2.2 Abfragen der Selektion 2.2.3 Verändern der Selektion 2.3 Öffnen und Schließen der Knoten 2.4 Verändern der Baumstruktur 3. Quellenangaben Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 3 1. J Table Die in Benutzeroberflächen am häufigsten eingesetzten Dialogelemente sind die Tabellen. Da in dem Paket JAVA.AWT die Komponente Tabelle fehlt, ist diese in SWING durch die Klasse JTable zur Verfügung gestellt. Mit Hilfe dieser Klasse lassen sich leicht textuelle oder graphische Daten tabellarisch darstellen und editieren. Hierbei entstehen weitreichende Möglichkeiten die Tabelle zu konfigurieren, den Inhalt anzupassen und auf Benutzerereignisse zu reagieren Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 4 1.1. Tabellenmodell Das Tabellenmodell wird benötigt: - für Anwendungen mit komplex Strukturierten Daten - falls Daten für Arrays zu Umfangreich sind - wenn Daten an externe Quellen gebunden sind Das Tabellenmodell muss das Interface TableModel aus dem Paket java.swing.table implementieren Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 5 1.1. Tabellenmodell Im Interface TabelModel sind folgende Methoden definiert: - die ersten beiden Methoden liefern die Zeilen und Spaltenanzahl zurück - public int getRowCount() - public int getColumnCount() - getColumnName liefert den Name der Spalte zurück - public String getColumnName(int columnIndex) - getColumnClass liefert den Typ der Elemente in einer Spalte zurück - public Class getColumnClass(int columnIndex) Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 6 1.1. Tabellenmodell - mit dieser Service Methode wird überprüft ob eine Zelle editiert werden darf - public boolean isCellEditable(int rowIndex, int columnIndex) - mit getValue wird der Wert einer bestimmten Zelle abgefragt - public Object getValueAt(int rowIndex, int columnIndex) - mit der Methode setValueAt wir ein bestimmter Wert in die Zelle geschrieben - public void setValueAt(Object aVal, int rowInd, int colInd) Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 7 1.1. Tabellenmodell - Hiermit kann ein TableModelListener registriert werden - public void addTableModelListener(TableModelListener l) - Mit dieser Methode kann der TableModelListener deregistriert werden - public void removeTableModelListener(TableModelListener l) Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 8 1.1. Tabellenmodell TableModelListener: Der TableModelListener wird über alle Änderungen an einer Tabelle informiert: - speziell wenn Spalten / Zeilen hinzugefügt oder entfernt werden - oder wenn Blöcke modifiziert werden sollen - Typischerweise registriert sich die JTable bei einem Modell um auf Änderungen reagieren zu können Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 9 1.1. Tabellenmodell Beispiel 1: Ein Modell für schwach besetzte Tabellen In diesem Beispiel wird eine sehr große Tabelle (500x500 Zellen) angelegt, mit nur wenig belegten Zellen. - Um eine speicherintensive Darstellung der Tabelle zu vermeiden, wird hier eine Hashtable verwendet. - Diese speichert nur die belegten Zellen ab. Das Grundmodell der Tabelle wird aus der Klasse AbstactTableModel des Pakets javax.swing.table gebildet. Thema: SWING Komponenten 2 Autor: André Palapies Konsolenausgabe nach „Drucken“ © 2008 Seite: 10 1.2. Spaltenmodell - Die Eigenschaften der Spalten können mit dem Spaltenmodell, welches in der Klasse JTabel enthalten ist, verändert werden. - Dies ist erforderlich sobald mehr als der Name der Spalte kontrolliert werden soll. - Das Spaltenmodell einer JTable muss das Interface TableColumModel implementieren. - Die Standard-Implementierung eines leeren Modells kann mit der Klasse DefaultTableColumModel vereinfacht werden. Die eigene Implementierung eines Modells kann sich als sehr aufwändig gestalten. Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 11 1.2. Spaltenmodell - Das hinzufügen oder entfernen einzelner Spaltenobjekte sieht wie folgt aus: - public void addColumn(TableColumn aColumn) - public void removeColumn(TableColumn column) - Jede Instanz der Klasse TabelModel repräsentiert dabei die Eigenschaften einer einzigen Tabellenspalte. - Es könnten beliebige weitere visuelle Eigenschaften kontrolliert werden Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 12 1.2. Spaltenmodell Beispiel 2: Eine JTabel mit eigenem Spaltenmodell - In diesem Beispiel wird gezeigt, wie man die anfängliche Breite der Spalten einer Tabelle explizit setzt. - Das Verhältnis der Spaltenbreite bleibt beim ändern der Fenstergröße gleich. - Durch hinzufügen von TableColum Objekten lässt sich die Spaltenbreite angeben - public TableColumn(int modelIndex, int width) Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 13 1.3. Rendering der Zellen - Der als Rendering bezeichnete Vorgang sorgt dafür, das die Zellen einer Tabelle auf dem Bildschirm dargestellt werden können. - Die Klasse JTable besitz einen Standard-Renderer, auf den mit folgenden Methoden zugegriffen werden kann: - public TableCellRenderer getDefaultRenderer (Class columnClass) - public void setDefaultRenderer (Class columnClass, TableCellRenderer renderer) - Sofern nicht in den Tabellenspalten ein eigener Renderer bestimmt wird, wird der Standard-Renderer verwendet. Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 14 1.3. Rendering der Zellen - Der Renderer muss das Interface TableCellRenderer Implementieren. Es enthält folgende Methode: - public Component getTableCellRendererComponent ( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column ) - Diese Methode arbeitet als so genannte Factory-Methode und wird aufgerufen wenn zur Darstellung einer Zelle ein Renderer benötigt wird. - Durch die übergebenen Argumente kann er erkennen in welcher Zelle er aktiv werden soll, welchen Inhalt sie hat, ob sie selektiert oder ob sie fokussiert ist. Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 15 1.3. Rendering der Zellen - Standardmäßig wird als Renderer eine Instanz der Klasse DefaultTableCellRenderer verwendet. Diese ist eine Ableitung der Klasse JLabel und dient dazu - die Farbe, Schriftart, Hintergrund der Tabelle - sowie die besonderen Eigenschaften der Zelle anzupassen. - pro Tabelle existiert nur eine Instanz, die für die Darstellung aller Zellen in der Tabelle verantwortlich ist. Das Label wird dazu jeweils an die Position der darzustellenden Zelle verschoben und die erforderlichen Eigenschaften übergeben. - Vom Ableiten einer eigenen Klasse aus dem DefaultTabelCellRenderer wird abgeraten, da dieser für die Anwendung eigentlich nicht vorgesehen war. Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 16 1.3. Rendering der Zellen Beispiel 3: Eine Tabelle mit eigenem Renderer - Im folgenden Beispiel wird ein eigener Renderer verwendet, der Zellen einer schon bekannten Tabelle in unterschiedlichen Farben darstellt. - Hierbei werden die Zellen der dritten Spalte nach Anzahl der erreichten Punkte eingefärbt. - die fokussierte Zeile ist hell Blau und die fokussierte Spalte ist dunkel Blau mit weißer Schrift Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 17 1.3. Rendering der Zellen - Bei jedem Aufruf von getTableCellRendererComponent erzeugt der Renderer eine Instanz der Klasse JLabel. - Da dieses während der arbeit mit einer Tabelle sehr häufig passiert, ist diese Vorgehensweise recht ineffizient und sollte nur bei kleineren Tabellen eine Lösung sein, da der Garbage-Collector sehr belastet wird. - Eine bessere Methode wäre zum Beispiel das Programm so zu schreiben, das nur eine Instanz erzeugt wird, oder das die Renderer zwischengespeichert werden und bei erneutem Bedarf wieder verwendet werden Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 18 1.4. Reaktion auf Ereignisse - Will ein Objekt z.B. über eine Änderung des Tabelleninhaltes, die Selektierung einer Zelle oder das anklicken einer Zelle mit der Mouse informiert werden, so bedarf es mehrerer Listener die die verschiedenen Ereignisse erfassen können. Veränderung des Tabelleninhaltes: - soll die Änderung des Tabelleninhaltes angezeigt werden, so muss im Tabellenmodel durch Aufruf des Listeners addTableModelListener ein TableModelListener registriert werden. - Bei jeder Änderung des Inhaltes wird dann die Methode tableChanged aufgerufen. Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 19 1.4. Reaktion auf Ereignisse Veränderung der Selektion: - soll darüber informiert werden, das sich die Selektion geändert hat, so werden zwei ListSelektionListener benötigt. - der erste wird auf dem Selektionsmodell registriert, der zweite wird auf dem Spaltenmodell registriert. - bei jeder Änderung der Selektion wird nun valueChanged aufgerufen und kann durch die Methoden getSelektionModel und getColumnModel ermitteln, welche Zeile und Spalte selektiert ist. Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 20 1.4. Reaktion auf Ereignisse Mouseklick auf Tabelle: - Soll auf einen Klick mit der Maustaste reagiert werden, kann durch Aufruf von addMouseListener ein MouseListener registriert werden. - Innerhalb seiner Ereignismethoden kann mit getX und getY die aktuelle Mausposition abgefragt und mit den Methoden rowAtPoint und columnAtPoint in Zeilen- und Spaltenwerte der Tabelle umgerechnet werden - public int rowAtPoint(Point point) public int columnAtPoint(Point point) Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 21 2. J Tree JTree ist die zweite große elementare Komponente in Swing - Eine JTree dient zur Bearbeitung, Darstellung und Navigation baumartiger, hierarchischer Datenstrukturen - Die besten Beispiele für eine derartige Baumstruktur sind das Dateisystem, wie zum Beispiel unter Windows, oder das Inhaltsverzeichnis eines Buches - Das Hauptverzeichnis wird auch Root-Verzeichnis genannt - Es können beliebig tief geschachtelte UnterverzeichnissStrukturen entstehen Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 22 2.1. Erzeugen eines Baumes Folgende Begriffe haben sich im Umgang mit Bäumen etabliert: - das Startelement wird Wurzel genannt - ein Element des Baumes wird als Knoten bezeichnet - die in einem Knoten enthaltenen Elemente bezeichnet man als Unterknoten oder Kindknoten - das übergeordnete Element bezeichnet man als Vaterknoten oder als Elternknoten - Knoten die keinen Unterknoten besitzen werden als Blätter bezeichnet - Knoten die sowohl Vater- als auch Unterknoten enthalten, bezeichnet man als innere Knoten Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 23 2.1. Erzeugen eines Baumes - Das Instanzieren eines JTree erfolgt über einen der beiden Konstruktoren dieser Klasse: - dieser Konstruktor erwartet ein vordefiniertes TreeModel - public JTree(TreeModel newModel) - dieser erwartet lediglich die Wurzel des Baumes und erzeugt ein DefaultTreeModel - public JTree(TreeNode root) - Ein TreeModel enthält alle relevanten Informationen über die Struktur des Baumes und kann auf anfrage Informationen über die Wurzel, die Knoten und Unterknoten liefern. Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 24 2.1. Erzeugen eines Baumes - Bei einem JTree kann durch eine Konfiguration festgelegt werden, ob das Root-Verzeichnis sichtbar ist oder nicht. - public void setRootVisible(boolean rootVisible) - public boolean isRootVisible() - Knoten aus Objekten des Typs DefaultMutableTreeNode sind Standardimplementierungen des TreeNode Interfaces, sie beschreiben, wie ein Knoten Informationen über seine Unter- und Vaterknoten zur Verfügung stellen kann. - die wichtigsten Methoden von TreeNode sind: - ermitteln der Anzahl der Unterknoten - public int getChildCount() Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 25 2.1. Erzeugen eines Baumes - folgende Methode liefert einen beliebigen Unterknoten - public TreeNode getChildAt(int childIndex) - mit der nächsten Methode getParent() kann der Vaterknoten ermittelt werden - public TreeNode getParent() - mit isLeaf() kann abgefragt werden ob ein Knoten ein Blatt ist oder noch einen Unterknoten besitzt - public boolean isLeaf() - Bei der Beschriftung des Knotens zur visuellen Darstellung wird die Methode toString der Knotenklasse verwendet Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 26 2.1. Erzeugen eines Baumes - eine einfache Implementierung von TreeNode steht mit defaultMutableTreeNode zur Verfügung - sie enthält das aus TreeNode abgeleitete Interface MutableTreeNode und bietet einfache Methoden zum einfügen und löschen von Knoten - public DefaultMutableTreeNode(Object userObject) - DefaultMutableTreeNode stellt eine Vielzahl von Methoden zur Verfügung. Sie kann unabhängig von der Verwendung in einem JTree zum Aufbau und zur Verarbeitung baumartiger Datenstrukturen verwendet werden. Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 27 2.1. Erzeugen eines Baumes Ausschnitt einiger wichtiger Methoden: - Hinzufügen eines Knoten ans ende der Liste der Unterknoten - public void add(MutableTreeNode newChild) - Hinzufügen eines Knoten an beliebiger Stelle - public void insert(MutableTreeNode newChild, int childIndex) - Remove entfernt einen beliebigen Kindknoten aus der Liste - public void remove(int childIndex) - Mit RemoveAllChildren werden alle Kindknoten gelöscht - public void removeAllChildren() Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 28 2.1. Erzeugen eines Baumes - Anwendungsbezogene Informationen werden in einem UserObjekt gehalten, welches direkt an den Konstruktor übergeben werden kann. Mit folgenden beiden Funktionen kann auch nach der Konstruktion noch darauf zugegriffen werden. - public void setUserObject(Object userObject) - public Object getUserObject() - das UserObject ist auch Lieferant für die Knotenbeschriftung: - jeder Aufruf von toString wird an das UserObject weitergeleitet. Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 29 2.1. Erzeugen eines Baumes Beispiel 4: Darstellung eines einfachen JTree - Nebenstehendes Bild zeigt die Baumstruktur eines JTree wie es in vielen Dateisystemen zum tragen kommt - Dieses Beispielprogramm erzeugt eine Wurzel, in der vier Unterknoten mit jeweils vier weiteren Blättern (Endpunkte) erzeugt werden Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 30 2.2. Selektieren von Knoten 2.2.1 Konfiguration der Selektionsmöglichkeiten - Das Selektieren von Knoten wird durch das TreeSelektionModel gesteuert, mit Hilfe der Methoden setSelektionModel und getSelektionModel kann darauf zugegriffen werden: - public void setSelectionModel (TreeSelectionModel selectionModel) - public TreeSelectionModel getSelectionModel() - Ein JTree erlaubt das Selektieren mehrerer Knoten gleichzeitig. Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 31 2.2.1 Konfiguration der Selektion - Falls die Selektionsmöglichkeit auf nur einen Knoten beschränkt werden soll, so muss ein eigenes TreeSelektionModel an setSelektionModel übergeben werden. - Dazu kann eine Instanz der Klasse DefaultTreeSelektionModel erzeugt und durch den Aufruf von setSelektionMode und der Übergabe einer Konstanten: konfiguriert werden: - public void setSelectionMode(int mode) - mode: - SINGLE_TREE_SELEKTION, - CONTIGUOUS_TREE_SELECTION - oder DISCONTIGUOUS_TREE_SELEKTION Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 32 2.2.2 Abfragen der Selektion - JTree stellt eine Reihe von Methoden zur Verfügung, mit denen man abfragen kann, ob und welche Knoten selektiert sind. Die wichtigsten von ihnen sind: - Mit getSelektedPath wird das selektierte Element ermittelt. Bei Mehrfachselektion liefert die Methode das erste Selektierte Element zurück. - public TreePath getSelectionPath() - getSelektionPaths gibt ein Array mit allen selektierten Knoten zurück - public TreePath[ ] getSelectionPaths() - getLeadSelektionPath liefert das markierte Element - public TreePath getLeadSelectionPath() Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 33 2.2.2 Abfragen der Selektion - Alle beschriebenen Methoden liefern Objekte des Typs TreePath zurück. Sie beschreibt den Knoten im Baum über den Pfad, der von der Wurzel aus beschrieben werden muss. - Mit getLastPathComponent kann das letzte Element dieses Pfads bestimmt werden. - public Object getLastPathComponent( ) - Mit getPath kann der komplette Pfad ermittelt werden. An erster Stelle liegt dabei die Wurzel des Baums, an letzter Stelle das selektierte Element: - public Object[ ] getPath( ) Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 34 2.2.2 Abfragen der Selektion - wenn ermittelt werden soll, ob und wenn welche Elemente im Baum selektiert sind, können die Methoden isSelectionEmpty und isPathSelected aufgerufen werden: - public boolean isSelectionEmpty() - public boolean isPathSelected(TreePath path) - jedes Element im Baum besitzt eine fortlaufende Nummer, die mit 0 bei der Wurzel beginnt und sich dann zeilenweise bis zum letzten Element fortsetzt. - mit Hilfe dieser Nummer kann alternativ zum TreePath auf die selektierten Elemente zugegriffen werden. Die Methoden heißen getSelectionRows und getLeadSelectionRow. Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 35 2.2.2 Abfragen der Selektion Soll ein JTree zur Steuerung anderer Komponenten reagieren, muss das Programm unmittelbar auf Änderungen der Selektion reagieren können. - dazu kann ein TreeSelectionListener instanziert werden und mit addTreeSelectionListener beim JTree registriert werden - jede Änderung ruft die Methode valueChanged auf : - public void valueChanged(TreeSelectionEvent event) - Dieses Event enthält unter anderem die Methoden getOldLeadSelectionPath und getNewLeadSelectionPath: - public TreePath getOldLeadSelectionPath() - public TreePath getNewLeadSelectionPath() Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 36 2.2.2 Abfragen der Selektion Beispiel 5: Ein JTree mit TreeSelektionListener Dieses Beispielprogramm erweitert das letzte Programm um die Funktionalität das selektierte Element auf der Konsole auszugeben. Dazu wird ein TreeSelektionModel für Einfachselektion implementiert und fügt einen TreeSelektionListener hinzu, der jede Selektionsänderung dokumentiert. Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 37 2.2.3 Verändern der Knoten Die Selektion kann auch programmgesteuert verändert werden: - Mit clearSelektion wird die Selektion gelöscht - public void clearSelection() - erweitern der Selektion um ein einzelnen Knoten - public void addSelectionPath(TreePath path) - erweitern der Selektion um eine beliebige Anzahl von Knoten - public void addSelectionPaths(TreePath[ ] paths) - unabhängig von der bisherigen Selektion, werden die als Argument übergebenen Knoten selektiert. - public void setSelectionPath(TreePath path) - public void setSelectionPaths(TreePath[ ] paths) Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 38 2.3. Öffnen und Schließen der Knoten Der Benutzer kann Knoten z.B. mit Mausbefehlen öffnen oder schließen. Dadurch können die Unterknoten entweder sichtbar oder versteckt werden. Mit folgende Methoden können die Knoten abgefragt oder konfiguriert werden: - isExpanded liefert true, wenn der Knoten geöffnet ist - public boolean isExpanded(TreePath path) - isCollapsed liefert true, wenn er geschlossen ist - public boolean isCollapsed(TreePath path) - hasBeenExpanded zeigt an, ob der Knoten überhaupt schon einmal geöffnet wurde - public boolean hasBeenExpanded(TreePath path) Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 39 2.3. Öffnen und Schließen der Knoten - isVisible gibt genau dann true zurück, wenn der Knoten sichtbar ist, d.h. wenn alle seine Elternknoten geöffnet sind - public boolean isVisible(TreePath path) - makeVisible kann ein Knoten sichtbar machen - public void makeVisible(TreePath path) - mit expandPath kann der Knoten geöffnet - public void expandPath(TreePath path) - mit collapsePath geschlossen werden - public void collapsePath(TreePath path) Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 40 2.4. Verändern der Baumstruktur Das Strukturelle und Inhaltliche ändern von Knoten, ist in einem vorhandenen JTree ohne weiteres möglich. - Wird die Knotenklasse DefaultMutableTreeNode verwendet, reicht es allerdings nicht aus die entsprechenden Methoden zum verändern aufzurufen. - In diesem Fall würde die Änderung im Datenmodell durchgeführt werden, aber die Bildschirmdarstellung würde gleich bleiben. - Alle Änderungen im Baum müssen über das JTree Modell ausgeführt werden. Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 41 2.4. Verändern der Baumstruktur - Für einfache Änderungen reicht es aus eine Instanz der Klasse DefaultTreeModel zu verwenden. - Sie stellt eine Vielzahl von Methoden zum hinzufügen, löschen und ändern der Knoten zur Verfügung. - Alle Änderungen werden sofort durch das Versenden eines TreeModelEvent automatisch an alle TreeModelListener weitergegeben und führen zu den gewünschten Veränderungen Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 42 2.4. Verändern der Baumstruktur Die zum Ändern des Modells benötigten Methoden von DefaultTreeModel sind: - insertNodeInto fügt ein neuen Kindknoten an einer beliebigen Position hinzu. - public void insertNodeInto( MutableTreeNode newChild, MutableTreeNode parent, int index ) - removeNodeFromParent entfernt einen beliebigen Knoten aus dem Baum (er darf auch Unterknoten enthalten) - public void removeNodeFromParent (MutableTreeNode node) Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 43 2.4. Verändern der Baumstruktur - nodeChanged aufruf, wenn sich der Inhalt eines Knotens so geändert hat dass seine Bildschirmdarstellung erneuert werden muss - public void nodeChanged(TreeNode node) - getPathToRoot ist eine Hilfsmethode, mit der das zur Konstruktion eines TreePath-Objekts erforderliche Knoten-Array auf einfache Weise erstellt werden kann. - public TreeNode[ ] getPathToRoot(TreeNode aNode) Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 44 2.4. Verändern der Baumstruktur Beispiel 6: Einfügen, Ändern und löschen in einem Baum - Dieses Beispielprogramm generiert einen Baum, der zunächst nur den Wurzelknoten enthält. - Dieser ist vom Typ DefaultMutableTreeNode und wird in ein DefaultTreeModel eingebettet. - Neben dem JTree enthält das Programm drei Buttons, mit denen ein neuer Knoten Eingefügt, gelöscht sowie seine Beschriftung geändert werden kann. Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 45 5. Quellenangaben Internet Seiten 1. www.galileo-press.de Skript 1. Einführung in JAVA Autor: Pernards / Klinker E-Books / Bücher 1. Java ist auch eine Insel Autor: Christian Ullenboom 2. Handbuch der Java Programmierung Autor: Guido Krüger / Thomas Stark Thema: SWING Komponenten 2 Autor: André Palapies © 2008 Seite: 46 Vielen Dank für Ihre Aufmerksamkeit