Ich möchte alle ausgewählten Werte in TreeView
mit CheckBoxTreeItem
s erhalten.JavaFX: Holen Sie den ausgewählten Wert, wenn CheckBoxTreeItem geklickt
Wie wird das erreicht?
Ich möchte alle ausgewählten Werte in TreeView
mit CheckBoxTreeItem
s erhalten.JavaFX: Holen Sie den ausgewählten Wert, wenn CheckBoxTreeItem geklickt
Wie wird das erreicht?
Sie können auf der Wurzel zu den Ereignissen hören einen Set<TreeItem>
auf dem neuesten Stand zu halten oder Sie können ein DFS für ausgewählte Objekte erstellen, die am Stamm beginnen.
Beachten Sie, dass der DFS-Ansatz sicherlich die kleinere Menge an Code benötigt, aber der andere Ansatz ermöglicht es Ihnen, während Modifikationen der Einrichtung auf dem neuesten Stand zu halten ...
@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);
}
}
Danke @fabian Befehle, um richtig zu arbeiten –
Wenn Sie eine TreeView
verwenden, können Sie das Element wie folgt gewählt erhalten:
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());
}
});
Es sollte beachtet werden, dass der Ansatz den Index einer ausgewählten Zelle und nicht die Werte des ausgewählten CheckBoxTreeItems ausgibt. – fabian
Aktualisiert, danke für Ihre Aufmerksamkeit, und ich denke, er wird nicht die erste brauchen, also lösche ich es! ! :) –
Bitte [Bearbeiten] Ihre Frage ein schließen [MCVE] erzeugt einen Baum wie den von Ihnen geposteten. Wie Sie die ausgewählten Elemente erhalten, hängt davon ab, wie Sie Ihre Baum- und Baumelemente eingerichtet haben, und hängt möglicherweise von bestimmten Methoden in Ihrer Modellklasse ab. –