2013-12-14 2 views
3

У меня есть TreeView, существующий из объектов User. TreeView представляет иерархию пользователей:expand TreeView (родительские) узлы, которые содержат выбранный элемент

  • master1
    • super1
    • Super2
      • User1
      • Пользователь2
    • Super3
      • User3
    • Super4
  • Master2
  • ...

Каждый TreeItem свернут, когда TreeView инициализируется. Однако может случиться так, что при загрузке FXML объект TreeItem передается из другого файла FXML. Например: User3 был принят через:

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

Я думаю, что он должен что-то сделать с тем, что функция является функцией void, и она должна возвращать объект TreeItem, я полагаю, но по какой-то причине мне это не удается.

Может ли кто-нибудь указать мне в правильном направлении?

ответ

4

Хорошо, я заметил, что в вашем методе expandTreeView() вы разворачиваете узел, а затем рекурсируете на предыдущий узел, чтобы развернуть это. В моем собственном коде я расширился от корня до листа, поэтому давайте попробуем это:

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

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

Привет, Юрген, это был тот же результат, но я нашел решение в сочетании с вышеизложенным! 'SelectedItem' не является TreeItem из недавно инициированного TreeView, поскольку он передается из другого файла FXML. Мне нужно пройти через инициированный TreeView, чтобы связать TreeItem от цикла до выбранногоItem. Как только это будет сделано, метод работает как прелесть. Большое спасибо за ваше время и Рождеством! – Perneel

0

Нет, я не думаю, что это потому, что ваш метод возвращается в пустоту. Попробуйте установить свой корень TreeView первой до расширения:

>>> tvUsers.setRoot(rootItem); 

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

Если это не сработает, то попробуйте упаковка ваш первоначальный expandTreeView(), чтобы запустить позже:

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

Привет, Юрген, спасибо за ваш ответ. Я пробовал, но, похоже, имеет тот же результат. Кажется, что цикл повторяется через узлы, например: '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

Привет, Юрген, да, я сделал. Кажется, не имеет никакого эффекта. – Perneel

Смежные вопросы