【问题标题】:TreeView containing different types包含不同类型的 TreeView
【发布时间】:2017-04-09 10:41:39
【问题描述】:

我使用CheckBoxTreeItem 让自己处于一个角落,因为我想要它提供的功能(如果选中了父项,则能够检查所有子项),但我的父项有一个Hyperlink 作为图形,而我的孩子有Strings 作为他们的图形。当您有一个包含两种不同类型(CheckBoxTreeItem<Hyperlink>CheckBoxTreeItem<String>)的 TreeView 时,Java 不喜欢它。我的选择是创建一个接受泛型类型的TreeView,或者找到一种将Hyperlinks 显示为纯文本的方法。我已经对泛型类型选项进行了几个小时的修改,但似乎无法让它工作。我更倾向于修改超链接,但无论哪种方式,我都会非常乐意提供建议。

【问题讨论】:

    标签: java javafx hyperlink treeview


    【解决方案1】:

    如果要添加Node 类型,可以使用TreeItemgraphic 属性。

    @Override
    public void start(Stage primaryStage) {
        CheckBoxTreeItem<String> item = new CheckBoxTreeItem<>(null, new Hyperlink("abc"));
        CheckBoxTreeItem<String> item2 = new CheckBoxTreeItem<>("Hello World");
        CheckBoxTreeItem<String> item3 = new CheckBoxTreeItem<>("42");
        item.getChildren().setAll(item2, item3);
    
        TreeView<String> treeView = new TreeView<>(item);
        treeView.setCellFactory(CheckBoxTreeCell.forTreeView());
    
        Scene scene = new Scene(treeView);
    
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    

    或者如果TreeItem值包含Node,则需要稍微修改CheckBoxTreeCellupdateItem方法:

    CheckBoxTreeItem<Object> item = new CheckBoxTreeItem<>(new Hyperlink("abc"));
    CheckBoxTreeItem<Object> item2 = new CheckBoxTreeItem<>("Hello World");
    CheckBoxTreeItem<Object> item3 = new CheckBoxTreeItem<>("42");
    CheckBoxTreeItem<Object> item4 = new CheckBoxTreeItem<>(new Hyperlink("def"));
    item.getChildren().setAll(item2, item3, item4);
    
    TreeView<Object> treeView = new TreeView<>(item);
    treeView.setCellFactory(tv -> new CheckBoxTreeCell<Object>() {
    
        private final HBox graphicWrapper = new HBox();
    
        {
            graphicWrapper.setAlignment(Pos.BASELINE_LEFT);
        }
    
        @Override
        public void updateItem(Object item, boolean empty) {
            graphicWrapper.getChildren().clear();
            super.updateItem(item, empty);
    
            if (!empty && (item instanceof Node)) {
                // replace graphic & text
                setText(null);
                graphicWrapper.getChildren().setAll(getGraphic(),  (Node) item);
                setGraphic(graphicWrapper);
            }
        }
    
    });
    

    【讨论】:

    • 采用方法一。像魅力一样工作。对于那些阅读,请确保包含 setCellFactory 行。否则你会得到一个只有字符串的 TreeView,没有 CheckBoxes。
    猜你喜欢
    • 2021-12-07
    • 1970-01-01
    • 2013-10-13
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    相关资源
    最近更新 更多