2017-01-02 5 views
1

Я хочу получить все выбранные значения в TreeView, содержащие CheckBoxTreeItem s.JavaFX: Получить выбранное значение, когда CheckBoxTreeItem нажал

Как это сделать?

enter image description here

+1

Пожалуйста [править] Ваш вопрос, чтобы включить [MCVE], который генерирует дерево, подобное тому, которое вы разместили. Как вы выбираете выбранные элементы, зависит от того, как вы настроили свои элементы дерева и дерева, и, возможно, зависит от определенных методов в вашем классе модели. –

ответ

4

Вы можете прослушивать события на корню, чтобы сохранить Set<TreeItem> до даты или вы можете сделать DFS для выбранных элементов, начиная с корня.

Обратите внимание, что подход ДФС, безусловно, требует меньшего количества кода, но другой подход позволяет сохранить настройки на сегодняшний день во время изменений ...

@Override 
public void start(Stage primaryStage) { 
    CheckBoxTreeItem<String> root = new CheckBoxTreeItem<>("root"); 
    CheckBoxTreeItem<String> c1 = new CheckBoxTreeItem<>("c1"); 
    c1.getChildren().addAll(
      new CheckBoxTreeItem<>("c1.1"), 
      new CheckBoxTreeItem<>("c1.2"), 
      new CheckBoxTreeItem<>("c1.3") 
    ); 
    CheckBoxTreeItem<String> c2 = new CheckBoxTreeItem<>("c2"); 
    c2.getChildren().addAll(
      new CheckBoxTreeItem<>("c2.1"), 
      new CheckBoxTreeItem<>("c2.2"), 
      new CheckBoxTreeItem<>("c2.3") 
    ); 
    CheckBoxTreeItem<String> c3 = new CheckBoxTreeItem<>("c3"); 
    c3.getChildren().addAll(
      new CheckBoxTreeItem<>("c3.1"), 
      new CheckBoxTreeItem<>("c3.2"), 
      new CheckBoxTreeItem<>("c3.3") 
    ); 
    root.getChildren().addAll(c1, c2, c3); 

    TreeView<String> treeView = new TreeView<>(root); 
    treeView.setCellFactory(CheckBoxTreeCell.forTreeView()); 
    Set<TreeItem<String>> selected = new HashSet<>(); 

    // listen for selection change 
    root.addEventHandler(CheckBoxTreeItem.checkBoxSelectionChangedEvent(), (CheckBoxTreeItem.TreeModificationEvent<String> evt) -> { 
     CheckBoxTreeItem<String> item = evt.getTreeItem(); 

     if (evt.wasIndeterminateChanged()) { 
      if (item.isIndeterminate()) { 
       selected.remove(item); 
      } else if (item.isSelected()) { 
       selected.add(item); 
      } 
     } else if (evt.wasSelectionChanged()) { 
      if (item.isSelected()) { 
       selected.add(item); 
      } else { 
       selected.remove(item); 
      } 
     } 
    }); 

    // listen for subtree add/remove 
    root.addEventHandler(TreeItem.childrenModificationEvent(), (TreeItem.TreeModificationEvent<String> evt) -> { 
     if (evt.wasAdded()) { 
      for (TreeItem<String> added : evt.getAddedChildren()) { 
       addSubtree(selected, (CheckBoxTreeItem<String>) added); 
      } 
     } 
     if (evt.wasRemoved()) { 
      for (TreeItem<String> removed : evt.getRemovedChildren()) { 
       removeSubtree(selected, (CheckBoxTreeItem<String>) removed); 
      } 
     } 
    }); 

    Button button = new Button("print selected"); 
    button.setOnAction(evt -> { 
     System.out.println("----------------"); 
     selected.stream().map(TreeItem::getValue).forEach(System.out::println); 
    }); 

    Button button2 = new Button("print dfs"); 
    button2.setOnAction(evt -> { 
     System.out.println("----------------"); 
     print(root); 
    }); 

    Button remove = new Button("remove"); 
    remove.setOnAction(evt -> { 
     root.getChildren().remove(c3); 
    }); 

    Scene scene = new Scene(new VBox(treeView, button, button2, remove)); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

private static <T> void removeSubtree(Collection<TreeItem<T>> collection, CheckBoxTreeItem<T> item) { 
    if (item.isSelected()) { 
     collection.remove(item); 
    } else if (!item.isIndeterminate() && !item.isIndependent()) { 
     return; 
    } 
    for (TreeItem<T> child : item.getChildren()) { 
     removeSubtree(collection, (CheckBoxTreeItem<T>) child); 
    } 
} 

private static <T> void addSubtree(Collection<TreeItem<T>> collection, CheckBoxTreeItem<T> item) { 
    if (item.isSelected()) { 
     collection.add(item); 
    } else if (!item.isIndeterminate() && !item.isIndependent()) { 
     return; 
    } 
    for (TreeItem<T> child : item.getChildren()) { 
     addSubtree(collection, (CheckBoxTreeItem<T>) child); 
    } 
} 

private static <T> void print(CheckBoxTreeItem<T> item) { 
    if (item.isSelected()) { 
     System.out.println(item.getValue()); 
    } else if (!item.isIndeterminate() && !item.isIndependent()) { 
     return; 
    } 
    for (TreeItem<T> child : item.getChildren()) { 
     print((CheckBoxTreeItem<T>) child); 
    } 
} 
+0

Спасибо @fabian Команды для правильной работы –

1

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

treeView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<TreeItem<String>>() { 

     @Override 
     public void changed(ObservableValue<? extends TreeItem<String>> observable, TreeItem<String> oldValue, 
       TreeItem<String> newValue) { 

      System.out.println("The selected item is : "newValue.getValue()); 


     } 
}); 
+1

Следует отметить, что подход печатает индекс выбранной ячейки, а не значения выбранного 'CheckBoxTreeItem'. – fabian

+0

Обновлено, спасибо за внимание, и я думаю, что ему не понадобится первый, поэтому я удалю его! ! :) –