【发布时间】:2018-02-28 03:48:21
【问题描述】:
我有一个 TreeView,其中有几个节点具有 CheckBoxes(请参阅 MWE)。
当折叠/展开某个节点时,其他节点的复选框被选中或取消选中。
要重现该行为,只需展开所有节点,检查ChildA,折叠Block1 和ChildC 将被自动检查。
package treeviewexample;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.control.cell.CheckBoxTreeCell;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class TreeViewExample extends Application {
@Override
public void start(Stage primaryStage) {
StackPane root = new StackPane();
/* example Treeview */
TreeView tw = new TreeView();
TreeItem rootNode = new TreeItem("Root");
TreeItem blockOne = new TreeItem("Block1");
TreeItem childA = new TreeItem("ChildA");
TreeItem childB = new TreeItem("ChildB");
blockOne.getChildren().add(childA);
blockOne.getChildren().add(childB);
TreeItem blockTwo = new TreeItem("Block2");
TreeItem childC = new TreeItem("ChildC");
TreeItem childD = new TreeItem("ChildD");
blockTwo.getChildren().add(childC);
blockTwo.getChildren().add(childD);
rootNode.getChildren().add(blockOne);
rootNode.getChildren().add(blockTwo);
tw.setRoot(rootNode);
/* add CheckBoxes */
tw.setCellFactory(CheckBoxTreeCell.<String>forTreeView());
root.getChildren().add(tw);
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
如何防止这种行为?在我的程序的稍后时间点,我想通过 TreeView 并获取节点的状态(检查与否)以使用它们。
来自https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/TreeCell.html 我知道以下内容:
由于 TreeCell 是从 IndexedCell 扩展而来的,因此每个 TreeCell 还提供了一个 index 属性。该索引将随着单元格的展开和折叠而更新,因此应将其视为视图索引而不是模型索引。
这是预期的行为吗?为什么会有人想要那个?
【问题讨论】:
标签: java checkbox javafx treeview treeviewitem