2017-12-29 16 views
1

Das Problem, an dem ich mich festhielt, ist das Abrufen von TreeView-Knoten, die bestimmte Child-Elemente zum Zusammenfalten/Erweitern enthalten und nicht alle TreeView-Knoten/Eltern. Ich versuchte Rekursion mit einem großen Fehler und konnte nicht realisieren, was die Lösung sein könnte.JavaFX nur TreeView Parents erweitern, die spezifische Child enthalten

Hier ist ein Blick auf meinem Code:

public void setTreeItem(Employee emp, TreeItem<Employee> root_tree) { 
    if (emp.equals(root_tree.getValue())) { 
     root_tree.setExpanded(false); 
    } else { 
     root_tree.setExpanded(true); 
     for (TreeItem<Employee> emps : root_tree.getChildren()) { 
      setTreeItem(emp, emps); 
     } 
    } 
} 

ich zu diesem Punkt zu kommen und gehen kann, nicht weiter. Als Referenz habe ich diese topic ausgecheckt, aber ich konnte die Idee von dieser Lösung nicht wirklich bekommen.

Das sind Bilder zur Demonstration:

first picture

Dies ist ein Bild, bevor du für spezifisches Element Überprüfung

second picture

und dieses Bild nach für das jeweilige Element Überprüfung (Mary Johnson).

Wie Sie sehen können, geht es durch die gesamte TreeView und erweitert alle TreeView Eltern, aber Mary Johnson ist nicht da.

+0

Können Sie erklären, was Sie zu tun versuchen? Wie sollte der Status des Baumes aussehen, nachdem Sie Ihre (schlecht benannte) 'setTreeItem' Methode aufgerufen haben? Nur der Pfad vom Stamm zum Element, das den angegebenen Wert enthält, sollte erweitert werden, und alles andere ist zusammengebrochen? Oder etwas anderes? –

Antwort

0

Sie erweitern die TreeItem s in Nicht-Terminal-Fällen, auch wenn das Element, nach dem Sie suchen, kein Nachkomme des Elements ist. Da Sie den gesamten Baum durchlaufen, werden alle Knoten erweitert. Um dies zu beheben bieten dieses Feedback als Rückgabewert:

public boolean setTreeItem(Employee emp, TreeItem<Employee> root_tree) { 
    if (emp.equals(root_tree.getValue())) { 
     root_tree.setExpanded(false); 
     return true; 
    } else { 
     for (TreeItem<Employee> emps : root_tree.getChildren()) { 
      if (setTreeItem(emp, emps)) { 
       // expand & return true, if item is a descendant of the current item 
       root_tree.setExpanded(true); 
       return true; 
      } 
     } 
     return false; // set expanded to false before returning here? 
    } 
} 

Statt true/false der Rückkehr können Sie auch die Rückkehr TreeItem Sie den Wert enthält, die für Sie suchen oder null und erweitern die Elemente später in einer Schleife

TreeItem<String> item = searchItem(someString, root); 
if (item != null) { 
    item.setExpanded(false); 
    item = item.getParent(); 
    while (item != null) { 
     item.setExpanded(true); 
     item = item.getParent(); 
    } 
} 
+0

Vielen Dank! Es funktioniert großartig. –