JavaFX 树视图TreeView

该文章介绍了如何使用JavaFX的TreeView组件展示文件系统目录结构。通过创建TreeItem表示文件和目录,实现节点的展开、折叠、点击事件处理,以及对Markdown文件内容的预览功能。同时,文章中还展示了如何自定义TreeCell和处理节点拖拽效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JavaFX 树视图TreeView


1、TreeView基础查看

javafx.scene.control.TreeView<T>
javafx.scene.control.TreeItem<T>
w3cschool:JavaFX 树视图
DOC-03-14 树视图(Tree View)

JavaFX视频教程第101课,TreeView的基本使用
JavaFX视频教程第102课,TreeView,TreeItem的几种事件
JavaFX视频教程第103课,TreeView,四种内置TreeCell效果
JavaFX视频教程第104课,TreeView,自定义TreeCell
JavaFX视频教程第105课,TreeView实现节点拖拽效果

2、显示案例

在这里插入图片描述

@FXML
protected void onButtonClick() {
    hBoxArea.getChildren().clear();

    File file = JavaFXTool.openFolderChooser(mStage);
    if (file != null && file.isDirectory()) {
        TreeItem<File> root = createNode(file);
        treeView.setRoot(root);

//            root.addEventHandler(TreeItem.<File>branchExpandedEvent(), event -> {
//                XLog.d("分支展开事件" + event.getTreeItem().getValue().getPath());
//            });
//
//            root.addEventHandler(TreeItem.<File>branchCollapsedEvent(), event -> {
//                XLog.d("分支折叠事件" + event.getTreeItem().getValue().getPath());
//            });
//
//            root.addEventHandler(TreeItem.<File>treeNotificationEvent(), event -> {
//                XLog.d("所有通知事件: EventType=" + event.getEventType() + "; value=" + event.getTreeItem().getValue().getPath());
//            });

        treeView.setCellFactory((Callback<TreeView, TreeCell>) param -> {
            TreeCell<File> treeCell = new TreeCell<File>() {
                @Override
                protected void updateItem(File item, boolean empty) {
                    super.updateItem(item, empty);
                    if (!empty) {
                        this.setText(item.getName());
                        if (item.isFile()) {
                            this.setOnMouseClicked(event -> {
                                if ("md".equals(Util.getExtension(item))) {
                                    XLog.d("setOnMouseClicked: item.getPath()=" + item.getPath());
                                    final String fileText = Util.getFileText(item);
                                    final String text = MdParser.render(MdParser.parse(fileText));
                                    XLog.d("setOnMouseClicked: MdParser =" + text);
                                    Platform.runLater(() -> {
                                        mWebEngine.loadContent(text);
                                    });
                                }
                            });
                        }
                    } else {
                        this.setGraphic(null);
                        this.setText(null);
                    }
                }
            };
            return treeCell;
        });
        hBoxArea.getChildren().add(treeView);
    }
    hBoxArea.getChildren().add(webView);
}

private TreeItem<File> createNode(final File f) {
    return new TreeItem<File>(f) {
        private boolean isLeaf;
        private boolean isFirstTimeChildren = true;
        private boolean isFirstTimeLeaf = true;

        @Override
        public ObservableList<TreeItem<File>> getChildren() {
            if (isFirstTimeChildren) {
                isFirstTimeChildren = false;
                super.getChildren().setAll(buildChildren(this));
            }
            return super.getChildren();
        }

        @Override
        public boolean isLeaf() {
            if (isFirstTimeLeaf) {
                isFirstTimeLeaf = false;
                File f = (File) getValue();
                isLeaf = f.isFile();
            }
            return isLeaf;
        }

        private ObservableList<TreeItem<File>> buildChildren(
                TreeItem<File> TreeItem) {
            File f = TreeItem.getValue();
            if (f == null) {
                return FXCollections.emptyObservableList();
            }
            if (f.isFile()) {
                return FXCollections.emptyObservableList();
            }
            File[] files = f.listFiles();
            if (files != null) {
                ObservableList<TreeItem<File>> children = FXCollections.observableArrayList();
                for (File childFile : files) {
                    children.add(createNode(childFile));
                }
                return children;
            }
            return FXCollections.emptyObservableList();
        }
    };
}
Java在窗口中添加树形菜单TreeView源代码,分享给JAVA新手的一个例子,JTextField jtfInfo; //文本域,用于显示点击的节点名称   public JTreeDemo(){    super("森林状的关系图"); //调用父类构造函数       DefaultMutableTreeNode root = new DefaultMutableTreeNode("设置"); //生成根节点    DefaultMutableTreeNode node1=new DefaultMutableTreeNode("常规"); //生成节点一    node1.add(new DefaultMutableTreeNode("默认路径")); //增加新节点到节点一上    node1.add(new DefaultMutableTreeNode("保存选项"));    root.add(node1); //增加节点一到根节点上    root.add(new DefaultMutableTreeNode("界面"));    root.add(new DefaultMutableTreeNode("提示声音"));    root.add(new DefaultMutableTreeNode("打印"));       JTree tree = new JTree(root); //得到JTree的实例    DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer)tree.getCellRenderer(); //得到JTree的Renderer    renderer.setLeafIcon(null); //设置叶子节点图标为空    renderer.setClosedIcon(null); //设置关闭节点的图标为空    renderer.setOpenIcon(null); //设置打开节点的图标为空       tree.addTreeSelectionListener(new TreeSelectionListener() { //选择节点的事件处理    public void valueChanged(TreeSelectionEvent evt) {    TreePath path = evt.getPath(); //得到选择路径    String info=path.getLastPathComponent().toString(); //得到选择的节点名称    jtfInfo.setText(info); //在文本域中显示名称    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xhBruce

佛系随缘,共同探讨

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值