Knoten im JTree hinzufügen/löschen mit eigenem Jtree

Status
Nicht offen für weitere Antworten.
S

Silent Water

Gast
Hallo

ich habe eine JTree Klasse
* MyLayerGraphJTree extends JTree

dargestellt wird ein Baum der Klasse
* public class LayeredGraph implements TreeModel

Dabei habe ich in dem Interface alle Funktionen geschrieben bis auf
Code:
public void valueForPathChanged(TreePath arg0, Object arg1)
public void addTreeModelListener(TreeModelListener arg0) 
public void removeTreeModelListener(TreeModelListener arg0)
da ich bei den dreien noch nicht ganz versatnden habe, was diese tun sollen

der Baum wird auch korrekt dargestellt. Nun will ich aber in meinem Baum auch Elemente löschen/einfügen. Wenn ich nun die Elemente im Internen Baum lösche/einfüge, dann wird diese Änderung allerdings nicht im JTree angezeigt.

also momentan sieht die Löschen Funktion wie folgt aus
Code:
		else if(action.getActionCommand().equals(DELETE_SELF)){
			TreePath selPath = this.getSelectionPath();
			LayeredGraph node = (LayeredGraph) selPath.getLastPathComponent();
			LayeredGraph parentNode = node.getParent();
			
			
			parentNode.removeChild(node.getDomainConcept());
			//LayeredGraph[] path= parentNode.getPathToRoot();
			//this.setSelectionPath(new TreePath(path));
			
			parentFrame.repaint();
			this.repaint();
		}

Vermutlich hängen das mit den drei Funktionen des Interface zusammen, die ich nicht "implementiert" habe. Oder wie kann ich dem Jtree mitteilen, dass er die Änderungen des Modells übernehmen soll?[/code]
 

AlArenal

Top Contributor
Wie du bereits vermutet hast, sind die noch nicht implementierten Methoden des Interface schuld. Ein JTree registriert sich als TreeModelListener bei seinem Model. Werden Daten im Model geändert, ruft man #valueForPathChanged mit entsprechenden Parametern auf und in ihr durchläuft man die Liste der registrierten Listener und informiert diese über Änderungen. Der Jtree empfängt diese Nachricht und entscheidet, ob die Änderung derart ist, dass er seine Anzeige aktualisieren muss.

Wenn du gerade keine passenden Beispiele finden kannst, schau dir mal die Sourcen der Implementierungen, wie z.B. von DefaultTreeModel aus dem Java SDK an (in dessen Hauptverzeichnis befindet sich eine Datei sources.zip).
 
G

Gast

Gast
Noch eine kleine Frage zu den TreeModelListener

im DefaultTreeModell, wird so weit ich es verstanden habe, der ganze Baum von einer Klasse verwaltet.

Bei mir ist der LayeredGraph ein einzelner Knoten. Wie viele solche TreeModelListener können zu einem einzigen Knoten hinzugefügt werden? Nur einer, oder muss ich diese in einer Liste verwalten
 

AlArenal

Top Contributor
Aus
Code:
public class LayeredGraph implements TreeModel
geht hervor, dass es sich um ein TreeModel, keinen Knoten handelt.

Ein TreeModel ist so ausgelegt beliebig viele Listener handhaben zu können. Darum heißt die Methode #addTreeModelListener und nicht #setTreeModelListener
 
G

Guest

Gast
Dann habe ich es mir bisher wohl etwas zu einfach gemacht. LayeredGraph hat das TreeModel Interface gehabt, aber jeder Knoten im Baum war auch solch ein LayeredGraph.

Hat bisher auch gut funktioniert, ohne "dynamische" Änderungen im Baum.

ich schätze dass ich nun aus meiner Klasse zwei Klassen machen muss:
* LayeredGraphModell
* LayeredGraphNode

ich habe mir auch DefaultTreeModel.java angesehen. So weit ich es verstanden habe, wird dort in 3 Schritten ein Knoten entfernt

removeNodeFromParent

diese funktion ruft dann

nodesWereRemoved

und diese

fireTreeNodesRemoved

auf. Soweit ich verstanden habe, passiert das wesentliche in der dritten Funtion, oder? Verstehe ich es richtig, wenn "einfach" in jeden TreeEventListener die Information hinzugefügt wird, dass der Knoten entfernt wurde.
 

AlArenal

Top Contributor
Prinzipiell handhabe ich es auch so, dass ein Node ein Interface implementiert, dass dem für die Struktur maßgeblichen Teil des TreeModel entspricht. U.U. sind dann noch Erweiterungen drin, für Sortierung, o.Ä.

Die Listener werden einfach bei jeder Änderung an den Daten informiert. Sie kümmern sich selbst darum zu entscheiden, ob die Änderung für sie relevant ist, oder nicht. Dabei gibt es Änderungen an einem einzelnen Node (kann z.B. die Darstellung über den Renderer beeinflussen) und diverse strukturelle Änderungen (Node entfernt, Node hinzugefügt, ..).

Im Grunde kannste schonmal anfangen dir ne Hilfsmethode zum Aufbaue des TreePath zu basteln, die wirste in jedem Fall brauchen. Die ist natürlich schnell gemacht, wenn man einfach nur vom betreffenden Node ausgehend rekursiv den Parent ermittelt, auf nen Stack schiebt und den am Ende invertiert dem Konstruktor von TreePath übergibt...
 
G

Guest

Gast
ich habe jetzt den Tree Listener integriert ........

Code:
	public void removeNode(LayeredGraphNode node){
		LayeredGraphNode parentNode = node.getParent();
		int childIndex = parentNode.getIndexOfChild(node);
		int[] childIndices = {childIndex};
		LayeredGraphNode[] childNodes = {node};
		if(parentNode != null){			
			parentNode.removeChild(node.getDomainConcept());
	        Object[] listeners = listenerList.getListenerList();
	        TreeModelEvent e = null;
	        for (int i = listeners.length-1; i>=0; i-=1) {
	            if (listeners[i]==TreeModelListener.class) {
	                // Lazily create the event:
	                if (e == null)
	                    e = new TreeModelEvent(parentNode, parentNode.getPathToRoot(),
	                    						childIndices, childNodes);
	                ((TreeModelListener)listeners[i+1]).treeNodesRemoved(e);
	            }          
	        }
		}
		
	}
wenn ich nun Elemente in der "ersten" Ebene entferne, dann funktioniert es sogar. Nur wenn ich Elemente in der zweiten Ebene Entferne, dann passiert nichts...... momentan habe ich allerdinsg keine Ahnung woran das liegen kann
 
G

Gast

Gast
Oh, danke

mein fehler war, dass ich die Liste vom Knoten zur Wurzel zurückgegeben habe, und nicht von der Wurzel zum Knoten.

Bei Pfaden der Länge 1 war das natürlich egal.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W JTree Knoten irgendwo hinzufügen AWT, Swing, JavaFX & SWT 2
richis-fragen JTree +/- verschwidet wenn Knoten keine Kinder hat... AWT, Swing, JavaFX & SWT 6
E Swing Copy und Paste eines einzelnen Knoten aus einem JTree AWT, Swing, JavaFX & SWT 1
N Swing JTree Problem beim erstellen der Knoten AWT, Swing, JavaFX & SWT 0
T JTree, Knoten mehrmals verwenden AWT, Swing, JavaFX & SWT 5
M JTree mit eigenen Knoten - Zugriff auf Daten AWT, Swing, JavaFX & SWT 6
C Knoten anzeigenb eim DnD in einem JTree AWT, Swing, JavaFX & SWT 4
H JTree - nach Auswahl aus JFileChooser wird nur der erste Knoten angezeigt AWT, Swing, JavaFX & SWT 3
Z Jtree Knoten ändern AWT, Swing, JavaFX & SWT 5
S JTree - Knoten mit animiertem GIF/Icon AWT, Swing, JavaFX & SWT 5
algorismi Knoten im JTree deaktivieren AWT, Swing, JavaFX & SWT 4
B JTree - pro Knoten kann nur ein Blatt eingefügt werden AWT, Swing, JavaFX & SWT 5
G JTree Knoten ein / ausblenden AWT, Swing, JavaFX & SWT 3
P JTree Knoten schliessen AWT, Swing, JavaFX & SWT 16
S JTree rendern der Knoten [+] und [-], nicht der Node Icons AWT, Swing, JavaFX & SWT 2
G JTree: mehrere Knoten selektieren! AWT, Swing, JavaFX & SWT 2
S JTree, Knoten anhand eines Pfades öffnen? AWT, Swing, JavaFX & SWT 2
masta // thomas JTree - Knoten ausblenden. AWT, Swing, JavaFX & SWT 3
S Blätter oder Knoten im JTree ordnen AWT, Swing, JavaFX & SWT 3
D JTree - Knoten einfügen und automatisch in den Editiermodus AWT, Swing, JavaFX & SWT 2
G JTree -- Node nach ändern in anderen Knoten AWT, Swing, JavaFX & SWT 15
L nur den JTree Knoten auf der Console ausgeben? AWT, Swing, JavaFX & SWT 6
W JTree, bei Drag Over über den Knoten "markieren" AWT, Swing, JavaFX & SWT 3
S JTree hinzugefügte Knoten anzeigen AWT, Swing, JavaFX & SWT 9
K Frage zu einem älteren Beitrag: JTree letzter Knoten auswähl AWT, Swing, JavaFX & SWT 2
G Knoten im Jtree mit unterscheidlichen Farben darstellen AWT, Swing, JavaFX & SWT 5
R JTree: TreeCellRenderer und Selektion eines Knoten AWT, Swing, JavaFX & SWT 10
G JTree - einzelnen Knoten löschen AWT, Swing, JavaFX & SWT 11
M Freiraum zwischen Knoten im JTree AWT, Swing, JavaFX & SWT 14
B Sichtbare Knoten im aktuellen Viewport eines JTree AWT, Swing, JavaFX & SWT 4
P JTree Knoten Öffnen - PER Programm AWT, Swing, JavaFX & SWT 5
D Knoten in JTree ausblenden. AWT, Swing, JavaFX & SWT 12
M JTree - Wie kann man einen einzelnen Knoten deselektieren? AWT, Swing, JavaFX & SWT 3
T Knoten in Jtree anders darstellen AWT, Swing, JavaFX & SWT 2
P JTree: Alle Knoten geöffnet anzeigen AWT, Swing, JavaFX & SWT 2
M Einen Knoten im JTree zusammenklappen? AWT, Swing, JavaFX & SWT 6
M JTree: Wie einen Knoten editieren? AWT, Swing, JavaFX & SWT 5
X JTree: Selektion nach dem Entfernen von Knoten AWT, Swing, JavaFX & SWT 2
W JTree Knoten oder Blatt AWT, Swing, JavaFX & SWT 3
W JTree löschen & überprüfen von Knoten oder Blatt AWT, Swing, JavaFX & SWT 3
X JavaFX Tooltips für XYChart-Knoten werden nicht angezeigt! AWT, Swing, JavaFX & SWT 3
B Knoten, Kanten erzeugen AWT, Swing, JavaFX & SWT 4
D AWT Knoten für Graphen kreisförmig anordnen AWT, Swing, JavaFX & SWT 5
D Erste Knoten des JTrees bei Start offen AWT, Swing, JavaFX & SWT 8
T TreeViewer knoten manuell umsortieren AWT, Swing, JavaFX & SWT 4
J Knotenselect von bestimmten Knoten im Tree AWT, Swing, JavaFX & SWT 2
P Eindeutiger Knoten im Treeview AWT, Swing, JavaFX & SWT 3
F Tree-Knoten programmgesteuert auswählen AWT, Swing, JavaFX & SWT 3
FrittenFritze JTree, LazyLoading und "Rückwärtstraversion" AWT, Swing, JavaFX & SWT 3
J Falsches Rendern durch JCheckBox in eigenem JTree AWT, Swing, JavaFX & SWT 6
F jTree und das Model aus einer eigenen Klasse AWT, Swing, JavaFX & SWT 1
F Jtree aus Klasse mit Arraylisten AWT, Swing, JavaFX & SWT 1
A Swing JList zu JTree AWT, Swing, JavaFX & SWT 11
RalleYTN Modaler Dialog und JTree Node mit sehr... seeeeehr vielen Elementen AWT, Swing, JavaFX & SWT 6
Z Swing JTree DefaultMultipleTreeNode Repräsentation ändern AWT, Swing, JavaFX & SWT 1
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
W Swing Anzeigefehler bei JTree AWT, Swing, JavaFX & SWT 1
S Zwei JTree, ein Model, bei Selection im ersten JTree soll der zweite die Inhlate anzeigen AWT, Swing, JavaFX & SWT 2
S JRadioButton und JCheckBox im JTree AWT, Swing, JavaFX & SWT 14
H Swing JTree: Zählt der rootNode mit? AWT, Swing, JavaFX & SWT 2
krgewb Swing JTree - Farbe von nodes ändern AWT, Swing, JavaFX & SWT 4
R JTree behandeln AWT, Swing, JavaFX & SWT 2
U dynamisches JTree erstellen AWT, Swing, JavaFX & SWT 2
J JTree updaten AWT, Swing, JavaFX & SWT 2
H JTree in JScrollPane passt sich nicht an Größe von JPanel an AWT, Swing, JavaFX & SWT 2
T Swing API Frage zu Verzeichnisbäumen und JTree AWT, Swing, JavaFX & SWT 1
T JTree mit Symbolen? AWT, Swing, JavaFX & SWT 8
R Anfängerfrage: Ansichten des JTree AWT, Swing, JavaFX & SWT 1
H Swing JTree Minimumgröße AWT, Swing, JavaFX & SWT 2
F Swing JTree + DiffUtils // Markierung Nodes aufheben AWT, Swing, JavaFX & SWT 2
I JTree wird nicht angezeigt AWT, Swing, JavaFX & SWT 3
M Swing JTree AWT, Swing, JavaFX & SWT 4
M Nodes in JTree nicht anzeigen AWT, Swing, JavaFX & SWT 0
T JTree mit Cloud verbinden AWT, Swing, JavaFX & SWT 0
H JTree Probleme AWT, Swing, JavaFX & SWT 9
F Swing Drag and Drop in JTree aus verschiedenen Listen AWT, Swing, JavaFX & SWT 6
M JButton wird von JTree überdeckt AWT, Swing, JavaFX & SWT 4
J Auf Dateien in JTree zugreifen AWT, Swing, JavaFX & SWT 15
F jTree.startEditingAtPath(path); funktioniert nicht bei eigenem CellEditor? AWT, Swing, JavaFX & SWT 8
D Swing JTree Steuerung AWT, Swing, JavaFX & SWT 11
S Swing JTree verwirrt mich AWT, Swing, JavaFX & SWT 2
T JTree - Elemente mit Doppelklick auswählen AWT, Swing, JavaFX & SWT 6
J JTree speichern AWT, Swing, JavaFX & SWT 4
N Swing JTree TreeCellRenderer mit html und automatischen Zeilenumbruch AWT, Swing, JavaFX & SWT 8
O Swing JTree um Label (oder Panel) erweitern AWT, Swing, JavaFX & SWT 9
B JTree mit Ordneransicht in JPanel einbinden AWT, Swing, JavaFX & SWT 4
D JTree node reagiert bei Klick nicht immer AWT, Swing, JavaFX & SWT 2
M Swing JTree: Wie kann ich die Hintergrundfarbe der selection ändern?!?! AWT, Swing, JavaFX & SWT 7
D Mehrmals auf Node im JTree klicken AWT, Swing, JavaFX & SWT 2
D JSplitPane, Jtree, CardLayout (constraint must be a string) AWT, Swing, JavaFX & SWT 9
N Swing FileFilter lässt JTree sich nicht öffnen AWT, Swing, JavaFX & SWT 2
X Swing 2 TreeModel und ein JTree synchronisieren AWT, Swing, JavaFX & SWT 3
N Swing JTree TreePath zu Windows Pfad? AWT, Swing, JavaFX & SWT 2
RELAXccc Swing JTree + JScrollPane, refresh Problem AWT, Swing, JavaFX & SWT 17
X Swing JTree aktualisieren AWT, Swing, JavaFX & SWT 2
V Swing JTree - Umbenennen selbst handlen. AWT, Swing, JavaFX & SWT 2
E Übergebenem JTree Blätter hinzufügen AWT, Swing, JavaFX & SWT 2
E Wert eines selektierten Knotens in einem JTree auslesen AWT, Swing, JavaFX & SWT 3
A Swing JTree - Nodes expanden AWT, Swing, JavaFX & SWT 2
D JTree nach Klick auf einen Hyperlink aktualisieren AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben