您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

Idea 插件之JTree

时间:2022-08-21 14:19:34  来源:  作者:木生杨

树型结构是比较常规的分类思维方式,好的分类规则能事半功倍,比如文件目录、日常开发的代码,时序图是树型结构的另一种展示形式。这里介绍插件中JTree的基本结构。

 

JTree对象生成及配置

/**     * 配置树对象     *     * @param tree   this.tree = new JXTree();     * @param treePanel   treePanel = new JScrollPane(); 滑动对象     * @param rootVisible 是否展示根节点     */    public static void configTree(JTree tree, JScrollPane treePanel, boolean rootVisible) {        // tree 配置        DefaultTreeModel model = (DefaultTreeModel) tree.getModel();        model.setRoot(new DefaultMutableTreeNode());        // 渲染树节点对象        tree.setCellRenderer(new MTTreeCellRenderer());        // 根节点不展示        tree.setRootVisible(rootVisible);        // true 或 false 决策根节点左上角折号是否展示        tree.setShowsRootHandles(true);        treePanel.setViewportView(tree);        // 快速搜索        new TreeSpeedSearch(tree);        // 用于loading的关键配置        ComponentUtil.putClientProperty(tree, ANIMATION_IN_RENDERER_ALLOWED, true);        ComponentUtil.putClientProperty(tree, AUTO_EXPAND_ALLOWED, false);        ComponentUtil.putClientProperty(tree, SHRINK_LONG_RENDERER, true);    }

JTree事件包装

/**     * @param tree     * @param treeContext 树所属的对象,一般用于树操作时需要数据传递     */    public static void addTreeEvent(JTree tree, TreePanelMark treeContext) {        // 树节点被选中时        tree.addTreeSelectionListener(e -> {            DefaultMutableTreeNode mutableTreeNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();            if (null == mutableTreeNode || !(mutableTreeNode.getUserObject() instanceof MTTreeCell)) {                return;            }            ((MTTreeCell) mutableTreeNode.getUserObject()).treeSelectionListener(tree, mutableTreeNode, treeContext);        });        // 树节被点击,单击、双击        tree.addMouseListener(new MouseAdapter() {            @Override            public void mouseClicked(MouseEvent e) {                if (SwingUtilities.isLeftMouseButton(e)) {                    final int doubleClick = 2;                    if (e.getClickCount() >= doubleClick) {                        DefaultMutableTreeNode mutableTreeNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();                        if (null == mutableTreeNode || !(mutableTreeNode.getUserObject() instanceof MTTreeCell)) {                            return;                        }                        ((MTTreeCell) mutableTreeNode.getUserObject()).doubleClick(tree, mutableTreeNode, treeContext);                    }                }            }            /**             * 右键菜单             */            @Override            public void mouseReleased(MouseEvent e) {                if (SwingUtilities.isRightMouseButton(e)) {                    TreePath path = tree.getPathForLocation(e.getX(), e.getY());                    tree.setSelectionPath(path);                    DefaultMutableTreeNode mutableTreeNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();                    if (null == mutableTreeNode || !(mutableTreeNode.getUserObject() instanceof MTTreeCell)) {                        return;                    }                    ((MTTreeCell) mutableTreeNode.getUserObject()).rightClick(tree, mutableTreeNode, e, treeContext);                }            }        });        // 按回车键跳转到对应方法        tree.addKeyListener(new KeyAdapter() {            @Override            public void keyPressed(KeyEvent e) {                super.keyPressed(e);                if (e.getKeyCode() == KeyEvent.VK_ENTER) {                    DefaultMutableTreeNode mutableTreeNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();                    if (null == mutableTreeNode || !(mutableTreeNode.getUserObject() instanceof MTTreeCell)) {                        return;                    }                    ((MTTreeCell) mutableTreeNode.getUserObject()).keyEnter(tree, mutableTreeNode, treeContext);                }            }        });    }

JTree递归包装成树节点

一般是 一个 userObject 对应一个 DefaultMutableTreeNode,树型关系由 DefaultMutableTreeNode 来维护,后面删除、添加、上移、下移方便处理。

/**     * 渲染遍历树     *     * @param tree     * @param rootTreeCell     */    public static DefaultMutableTreeNode renderRepeaterTree(JTree tree, MTTreeCell rootTreeCell) {        if (null == rootTreeCell) {            return null;        }        DefaultMutableTreeNode root = new DefaultMutableTreeNode(rootTreeCell);        renderRepeaterTreeSub(rootTreeCell.subTreeCell(), root);        DefaultTreeModel model = (DefaultTreeModel) tree.getModel();        model.setRoot(root);        expandOrCollapAll(tree, new TreePath(tree.getModel().getRoot()), true);        return root;    }    /**     * 递归遍历数据结构生成树节点     *     * @param subTreeCells     * @param parentNode     */    public static void renderRepeaterTreeSub(List<MTTreeCell> subTreeCells, DefaultMutableTreeNode parentNode) {        if (CollectionUtils.isEmpty(subTreeCells)) {            return;        }        for (MTTreeCell subTreeCell : subTreeCells) {            DefaultMutableTreeNode treeNode = new DefaultMutableTreeNode(subTreeCell);            parentNode.add(treeNode);            renderRepeaterTreeSub(subTreeCell.subTreeCell(), treeNode);        }    }

JTree展开、收起树节点

/**     * 展开tree视图     *     * @param parent treePath     * @param expand 是否展开     */    public static void expandOrCollapAll(@NotNull JTree tree, @NotNull TreePath parent, boolean expand) {        TreeNode node = (TreeNode) parent.getLastPathComponent();        if (node.getChildCount() >= 0) {            for (Enumeration<?> e = node.children(); e.hasMoreElements(); ) {                TreeNode n = (TreeNode) e.nextElement();                TreePath path = parent.pathByAddingChild(n);                expandOrCollapAll(tree, path, expand);            }        }        // 展开或收起必须自下而上进行        if (expand) {            tree.expandPath(parent);        } else {            tree.collapsePath(parent);        }    }

JTree重新加载

当子节点变化后需要重新加载已经变化的子节点

/**     * 重新加载     *     * @param jTree     * @param node 变化的子节点的父节点     */    public static void reload(JTree jTree, DefaultMutableTreeNode node) {        ((DefaultTreeModel) jTree.getModel()).reload(node);    }

JTree 渲染对象 Renderer

public class MTTreeCellRenderer extends ColoredTreeCellRenderer {    /**     * 渲染每个节点     *     * @param tree     * @param value     * @param selected     * @param expanded     * @param leaf     * @param row     * @param hasFocus     */    @Override    public void customizeCellRenderer(@NotNull JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {        Object obj = ((DefaultMutableTreeNode) value).getUserObject();        if (obj instanceof MTTreeCell) {            MTTreeCell node = (MTTreeCell) obj;            Icon loadingIcon = node.loadingIcon();            if (null != loadingIcon) {                setIcon(loadingIcon);            } else if (null != node.selfControlSelect()) {                if (node.selfControlSelect()) {                    setIcon(node.iconSelected());                } else {                    setIcon(node.iconUnselected());                }            } else {                if (selected) {                    if (null != node.iconSelected()) {                        setIcon(node.iconSelected());                    }                } else {                    if (null != node.iconUnselected()) {                        setIcon(node.iconUnselected());                    }                }            }            if (null == node.fontAttributes()) {                Append(node.cellShow());            } else {                append(node.cellShow(), node.fontAttributes());            }        }    }}


Tags:Idea   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
八个IntelliJ IDEA中常用的快捷键
1 使用驼峰命名法快速打开类这是一个简单而强大的功能,只输入驼峰命名法中的首字母缩写就可以查找/打开所需的类。比如说,类名是TopLevelDestination,只需输入TLD就能立即打开...【详细内容】
2023-11-23  Search: Idea  点击:(159)  评论:(0)  加入收藏
IntelliJ IDEA插件开发入门实战
IntelliJ IDEA是一款强大的Java开发工具,提供了丰富的API,为你钟爱的IDE增添了无限可能。与此同时,庞大而活跃的IntelliJ IDEA社区可以帮助解决问题并提升技能。无论你在插件开...【详细内容】
2023-11-14  Search: Idea  点击:(229)  评论:(0)  加入收藏
IntelliJ IDEA 一些不为人知的功能
今天聊的这些功能可能社区版没有,就需要下载专业版,如何使用专业版,请看这里:kdocs.cn/l/cdW01CjMHzjw我相信现在Java开发者应该80%都在使用IDEA作为开发工具吧,今天我们将深入了...【详细内容】
2023-11-09  Search: Idea  点击:(235)  评论:(0)  加入收藏
Eclipse、IntelliJ IDEA、PyCharm三种IDE的区别
Eclipse、IntelliJ IDEA和PyCharm是三种流行的集成开发环境(IDE),每个都有其特性和优点。1. Eclipse:Eclipse是一款开源的Java IDE,由Eclipse基金会开发。它具有许多功能,包括代码...【详细内容】
2023-11-07  Search: Idea  点击:(145)  评论:(0)  加入收藏
用IntelliJ IDEA进行前端开发
在这个数字化的时代,网络开发工具层出不穷,各自都宣称可以让开发过程更加流畅和高效。在这个竞争激烈的领域中,有一个工具引人注目,那就是IntelliJ IDEA,一个由JetBrains开发的强...【详细内容】
2023-10-16  Search: Idea  点击:(343)  评论:(0)  加入收藏
掌握IntelliJ IDEA 中的“下架”与“上架”功能,编程效率翻倍
你是否经常需要在处理一个任务时,突然要转而处理另一个任务?在这种情况下,你也许不想提交尚未完成的更改,但又不希望丢失已经做出的修改。为了解决这个问题,有一个非常方便的功能...【详细内容】
2023-10-11  Search: Idea  点击:(239)  评论:(0)  加入收藏
十个超级高效的IntelliJ IDEA插件
1. Code With Me【下载地址】https://plugins.jetbrains.com/plugin/14896-code-with-meCode With Me是一款支持协作开发和配对编程的插件。此插件支持多个开发人员同时在同...【详细内容】
2023-10-08  Search: Idea  点击:(330)  评论:(0)  加入收藏
7个应该牢记于心的IntelliJ IDEA快捷键
Jetbrains编辑器家族在市场上凭借其卓越的功能和用户友好的界面获得了大量用户的支持。这个家族基于Jetbrains IntelliJ平台,提供了多款IDE可供选择,包括Intellij IDEA、Andro...【详细内容】
2023-07-25  Search: Idea  点击:(100)  评论:(0)  加入收藏
五个IntelliJ IDEA插件,高效编写代码
人工智能AI是当前广受认可的未来趋势和发展方向。虽然有些人担心AI可能会取代所有的工作,但实际上只会取代那些重复性高、产出低的工作。因此,我们应该学会更加聪明地工作,而不...【详细内容】
2023-07-06  Search: Idea  点击:(287)  评论:(0)  加入收藏
如何用idea进行安卓开发
序如果不是为了交作业,我是真不想搞这个东西,搞了一下午了头疼,思想汇报都还没赶完。网上的配置也找了一堆,可能是我太菜了,反正我电脑就是说不行,那我还是自己写一篇瞎琢磨琢磨。...【详细内容】
2023-03-07  Search: Idea  点击:(348)  评论:(0)  加入收藏
▌简易百科推荐
Netflix 是如何管理 2.38 亿会员的
作者 | Surabhi Diwan译者 | 明知山策划 | TinaNetflix 高级软件工程师 Surabhi Diwan 在 2023 年旧金山 QCon 大会上发表了题为管理 Netflix 的 2.38 亿会员 的演讲。她在...【详细内容】
2024-04-08    InfoQ  Tags:Netflix   点击:(2)  评论:(0)  加入收藏
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(7)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(13)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(9)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(11)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(9)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
站内最新
站内热门
站内头条