2017-12-29 40 views
1

私が抱えている問題は、折りたたむ/折りたたむすべてのTreeViewノード/親ではなく、折りたたみ/拡張する特定の子を含むTreeViewノードを取得することです。私は大きな失敗で再帰を試み、解決策が何であるかを理解できませんでした。ここでJavaFXのみ展開するTreeView特定の子を含む親

は、私のコードを見ている:

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); 
     } 
    } 
} 

私はこのポイントを取得し、先に進むことはできません。参考のために、私はこれをチェックアウトtopicしかし、私は実際にその解決策からアイデアを得ることができませんでした。

者はデモのための写真です:

first picture

これは、特定の要素の

second picture

をチェックする前に、絵であり、これは、その特定の要素(メアリー・ジョンソンのチェック後に絵です)。

ご覧のとおり、ツリービュー全体を通過し、すべてのツリービューの親を拡張しますが、すべての後にMary Johnsonは存在しません。

+0

あなたがしようとしていることを明確にすることはできますか?あなたの(あまり名前がつけられていない) 'setTreeItem'メソッドを呼び出した後、ツリーの状態はどうなりますか?ルートから指定した値を含むアイテムまでのパスのみを展開し、それ以外はすべて折りたたむ必要がありますか?または、他の何か? –

答えて

0

検索対象のアイテムがアイテムの子孫でない場合でも、非ターミナルケースではTreeItemを展開します。ツリー全体を横断しているので、すべてのノードが展開されます。これは戻り値としてフィードバックを提供する修正するには:

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? 
    } 
} 

代わりのtrue/falseを返すあなたもTreeItemあなたはあなたが検索したりnull以降ループ

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

ありがとうございました!それは素晴らしい作品です。 –

関連する問題