2013-12-14 64 views
3

我有一個存在於User對象之外的TreeView。樹視圖表示用戶的層次結構:展開包含所選項目的TreeView(父)節點

  • Master1
    • Super1
    • SUPER2
      • User1的
      • 用戶2
    • Super3
      • 用戶3
    • Super4
  • Master2
  • ...

每TreeItem當TreeView控件初始化已展開。但是,可能會在FXML加載時從另一個FXML文件傳遞一個TreeItem對象。例如:用戶3已經穿過:

selectedUserTreeItem = (TreeItem<User>) currentNavigation.getPassthroughObject(); //this is the User3 TreeItem 

我嘗試使用遞歸函數從selecterUserTreeItem

if (selectedUserTreeItem != null) { 
    expandTreeView(selectedUserTreeItem); 
} 

tvUsers.setRoot(rootItem); 

此展開所有的父節點是我到目前爲止有:

private void expandTreeView(TreeItem<User> selectedItem) {   
    if (selectedItem != null) { 
     System.out.println(selectedItem); 
     if (selectedItem.isLeaf() == false) { 
      selectedItem.setExpanded(true); 
     } 
     TreeItem<User> parent = selectedItem.getParent(); 
     expandTreeView(parent); 
    } else { 
     System.out.println("null"); 
    } 
} 

我認爲它必須做的事情,該函數是一個無效的功能,它應該返回一個TreeItem對象,我想,但由於某種原因,我沒有成功做到這一點。

難道有人指着我正確的方向嗎?

回答

4

好吧,我注意到,在您的expandTreeView()方法中,展開節點,然後遞歸到前一個節點以展開該節點。在我自己的代碼中,我從根擴展到葉,所以讓我們試試看:

private void expandTreeView(TreeItem<User> selectedItem) 
{ 
    if (selectedItem != null) 
    { 
     expandTreeView(selectedItem.getParent()); 

     if (! selectedItem.isLeaf()) 
     { 
      selectedItem.setExpanded(true); 
     } 
    } 
} 
+0

您好Jurgen,這是相同的結果,但我發現與上述組合的解決方案! 'selectedItem'不是來自新啓動的TreeView的TreeItem,因爲它是從另一個FXML文件傳遞的。我必須通過啓動的TreeView循環來將TreeItem從循環鏈接到selectedItem。一旦完成,該方法就成爲一種魅力。非常感謝您的時間和聖誕快樂! – Perneel

0

不,我不認爲它是因爲你的方法返回void。 嘗試擴大之前,首先設置您的TreeView根:

>>> tvUsers.setRoot(rootItem); 

if (selectedUserTreeItem != null) { 
    expandTreeView(selectedUserTreeItem); 
} 

如果不工作,然後嘗試包裝你最初expandTreeView()以後運行:

Platform.runlater(new Runnable() 
{ 
    public void run() { expandTreeView(selectedUserTreeItem); } 
}; 
+0

嗨Jurgen,感謝您的回覆。我試過了,但它似乎有相同的結果。它似乎通過節點循環正確,例如:'User1 - Super2(擴展)--Master1(擴展)'。我只是不明白:) – Perneel

+0

好的,希望以上內容適用於你的情況。看下一個建議。 – Jurgen

0

好吧,我有同樣的問題,發現我不得不推遲擴張有點像這樣:

Platform.runlater(new Task<Void>() 
    { 
     @Override 
     protected Void call() throws Exception 
     { 
      Thread.sleep(250); 
      return null; 
     } 

     @Override 
     protected void succeeded() 
     { 
      expandTreeView(selectedUserTreeItem); 
     } 

    }); 

您可能必須嘗試和改變延遲讓它在你的情況下工作。

+0

嘿尤爾根,再次感謝!我已經嘗試過你的建議,它似乎有相同的結果。 TreeItems由於某種原因沒有擴展......甚至用2500ms來試用它 – Perneel

+0

您是否已經將tvUsers.setRoot(rootItem)移動到expandTreeView()方法調用之前? – Jurgen

+0

你好Jurgen,是的,我做到了。似乎沒有效果。 – Perneel

相關問題