JavaFX:在 TreeView 中显示存储的 CheckBoxTreeItem 选择

JavaFX: display stored CheckBoxTreeItem selection in TreeView

我将 treeView 用于 select 部分,这些部分稍后将显示在报告中。为了提高用户友好性,我决定保存 selection,这样用户下次就不必再 select 相同的部分了。我已经保存了 selection,但是当初始化视图时,treeView 没有正确显示 selection (img 1)。我正在寻找一种显示 treeView 的方法,如 img 2 中所示。

public class Main extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        CheckBoxTreeItem<String> rootItem = new CheckBoxTreeItem<>("Root");

        CheckBoxTreeItem<String> aItem = new CheckBoxTreeItem<>("A");

        CheckBoxTreeItem<String> a1Item = new CheckBoxTreeItem<>("A_1");
        CheckBoxTreeItem<String> a2Item = new CheckBoxTreeItem<>("A_2");

        CheckBoxTreeItem<String> bItem = new CheckBoxTreeItem<>("B");
        CheckBoxTreeItem<String> cItem = new CheckBoxTreeItem<>("C");

        a1Item.setSelected(true);
        aItem.setExpanded(true);

        aItem.getChildren().addAll(a1Item, a2Item);

        rootItem.getChildren().addAll(aItem, bItem, cItem);
        rootItem.setExpanded(true);

        TreeView treeView = new TreeView(rootItem);
        treeView.setCellFactory(CheckBoxTreeCell.<String>forTreeView());

        Scene scene = new Scene(treeView, 400, 400);
        scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

如果您首先将您的 CheckBoxTreeItem 添加到它们各自的父级,那么在您更改值之前,值更改触发器会起作用,并且应用程序会按预期工作。

aItem.getChildren().addAll(a1Item, a2Item);

rootItem.getChildren().addAll(aItem, bItem, cItem);

a1Item.setSelected(true);
aItem.setExpanded(true);