You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaFX TreeView点击节点后随机出现额外图标问题求助

我来分享下如何用JavaFX TreeView结合Jfeniox的Material Design图标实现节点图标展示,同时完成点击节点后随机图标追加到列表末尾的功能:

实现步骤说明

1. 自定义TreeCell渲染节点(核心图标展示)

首先通过setCellFactory自定义TreeCell的渲染逻辑,根据节点对应的LeafItem类型来设置不同的图标和文本,同时处理根节点的特殊展示:

rootTreeView.setCellFactory(tv -> new TreeCell<LeafItem>() {
    @Override
    public void updateItem(final LeafItem item, final boolean empty) {
        super.updateItem(item, empty);
        // 先清空原有内容,避免复用Cell时出现脏数据
        setText(null);
        setTooltip(null);
        setContextMenu(null);
        
        if (!empty) {
            // 处理根节点的特殊文本展示
            if (getTreeItem().equals(rootTreeItem)) {
                if (item == null) {
                    setText("sasa");
                }
            }
            // 针对Project类型节点,设置名称和文件夹图标
            if (item instanceof Project) {
                final Project project = (Project) item;
                setText(project.getName());
                setGraphic(createIcon(MaterialDesignIcon.FOLDER));
            }
        }
    }
});

2. 封装Material Design图标创建方法

为了统一管理图标样式,封装一个工具方法来创建Material Design图标,固定设置大小和样式类,方便后续复用:

private MaterialDesignIconView createIcon(final MaterialDesignIcon icon) {
    final MaterialDesignIconView materialDesignIconView = new MaterialDesignIconView(icon);
    materialDesignIconView.setSize("1.5em");
    // 通过CSS类统一控制图标颜色,需要在你的样式文件中定义该类
    materialDesignIconView.setStyleClass("icon-color");
    return materialDesignIconView;
}

3. 添加节点点击事件(实现随机图标追加)

要实现点击节点后随机图标出现在列表末尾,我们给TreeView添加选中事件监听,随机选择一个Material Design图标,创建对应的节点并追加到根节点的子列表末尾:

// 监听TreeView的节点选中事件
rootTreeView.getSelectionModel().selectedItemProperty().addListener((obs, oldItem, newItem) -> {
    if (newItem != null && newItem.getValue() != null) {
        // 随机选取一个Material Design图标
        MaterialDesignIcon[] allIcons = MaterialDesignIcon.values();
        MaterialDesignIcon randomIcon = allIcons[(int) (Math.random() * allIcons.length)];
        
        // 创建对应的LeafItem实例(替换成你业务中实际的Item实现)
        LeafItem randomLeafItem = new LeafItem() {};
        
        // 构建TreeItem并设置随机图标
        TreeItem<LeafItem> randomTreeItem = new TreeItem<>(randomLeafItem);
        randomTreeItem.setGraphic(createIcon(randomIcon));
        
        // 将新节点追加到根节点的子节点末尾
        rootTreeItem.getChildren().add(randomTreeItem);
    }
});

小提示

  • 确保已经正确引入Jfeniox库的依赖,否则MaterialDesignIcon和MaterialDesignIconView无法正常使用
  • icon-color样式类需要在你的CSS文件中定义,比如:.icon-color { -fx-fill: #2196F3; }来统一设置图标颜色

内容的提问来源于stack exchange,提问作者Saurabh Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:47:10