2016-03-22 3 views
0

Ich habe eine JTree, projectView:Entfernen Kinder aus DefaultMutableTreeNode rekursiv nicht in Rahmen aktualisieren richtig

projectView = new JTree(projectViewTop); 
projectView.setBackground(Color.WHITE); 
projectView.setSize(250, getHeight()); 
projectView.setLocation(0, 0); 
projectView.setVisible(true); 
projectView.addKeyListener(this); 
add(projectView); 

Wo projectViewTop der Hauptknoten (DefaultMutableTreeNode) des JTree:

DefaultMutableTreeNode projectViewTop = new DefaultMutableTreeNode("Project"); 

Die projectViewTop hat einige untergeordnete Knoten, die auch Unter-Untergeordnete enthalten (ProjektViewTop ist der Knoten 'Projekt [Mein Projekt]'):

enter image description here

An einem Punkt muss ich jedes Kind des projectViewTop Knoten löschen. Ich habe diese Methode, um sie rekursiv zu löschen:

public void clearNode(DefaultMutableTreeNode node) { 
    for (int i = 0; i < node.getChildCount(); i++) { 
     DefaultMutableTreeNode child = (DefaultMutableTreeNode) node.getChildAt(i); 
     clearNode(child); 
    } 
    node.removeAllChildren(); 
} 

Allerdings, wenn ich diese Methode ausführen, wird der Inhalt nicht visuell gelöscht bekommen. Dies ist, was mit dem JTree Anzeige passiert:

enter image description here

Auf der anderen Seite, wenn ich den Hauptknoten kollabieren, es löscht alles richtig (es scheint, die Visuals nur aktualisiert, wenn ich den Hauptknoten kollabieren). Wie kann ich verhindern, dass "schmutzige" Kinderknoten beim Löschen auf dem Hauptknoten bleiben?

+0

@AndrewThompson Ich meine, ich habe versucht, dies so einfach wie möglich zu machen, weil das Problem wahrscheinlich eine fehlende Aussage/ein Fehler an meinem Ende ist. Wenn Sie denken, ich sollte etwas ändern, lassen Sie es mich wissen? – Momo

+1

Sie müssen das 'TreeModel' benachrichtigen, dass sich die Struktur geändert hat,' DefaultTreeModel' hat ein ['nodesWereRemoved'] (https://docs.oracle.com/javase/7/docs/api/javax/swing/tree/ DefaultTreeModel.html # nodesWereRemoved (javax.swing.tree.TreeNode,% 20int [],% 20java.lang.Object [])) Methode, die Sie verwenden können, wenn Sie ein 'DefaultTreeModel' verwenden, wissen die Knoten selbst nichts über das Modell ... yep, es ist alles Spaß Zeug – MadProgrammer

+0

@MadProgrammer Ich habe stattdessen die 'nodeStructureChanged' Methode verwendet, macht es das Zeug ganz von selbst. Ziemlich praktisch. Wenn es Ihnen nichts ausmacht, können Sie die Antwort schreiben, und ich werde es als akzeptiert markieren – Momo

Antwort

1

Sie müssen die TreeModel mitteilen, dass sich die Struktur geändert hat.

Aus irgendeinem Grund (ich nehme an, es ist eine Optimierung Wahl), die Knoten haben keine (direkte) Verbindung zu der TreeModel, sie sind ein bisschen wie zwei Modelle zusammenarbeiten, aber wo man nicht mit dem anderen spricht ... ja, das ist sehr ärgerlich

Also, wenn Sie den „Knoten“ Baum ändern, müssen Sie die TreeModel benachrichtigen und wird ein Update auf die JTree ...

DefaultTreeModel hat eine nodesWereRemoved Verfahren führen die Sie können verwenden, wenn Sie eine DefaultTreeModel verwenden.

+0

Sorry, was ??? ............, sonst nichts – mKorbel

+0

@mKorbel Sorry, keine Bilder heute: P – MadProgrammer