JAVA中分别采用递归和非递归方法创建菜单栏

STM32F103工程模板搭建避坑指南:解决‘Manage Run-Time Environment’弹窗、启动文件选择与宏定义配置 本文详细解析了STM32F103工程模板搭建过程中的常见问题,包括‘Manage Run-Time Environment’弹窗处理、启动文件选择与宏定义配置。通过实战解决方案和调试技巧,帮助开发者快速避坑,高效完成工程搭建,特别适合使用STM32F103ZET6和固件库的开发者。 阅读详情

1.首先编写一个创建树的方法。该方法中传入的形参为包含菜单栏信息的列表,返回值为菜单树的根结点。

public static final DefaultMutableTreeNode createTree(List<Node> list) {
        DefaultMutableTreeNode tree = new DefaultMutableTreeNode("root");
        Map<String, DefaultMutableTreeNode> map = getTreeNodeMap(list);
        while (list.size() > 0) {
            Node n = list.get(list.size() - 1);
            if (map.get(n.getSuperid()) == null) {
                tree.add(map.get(n.getId()));
                list.remove(n);
            } else {
                DefaultMutableTreeNode treeNode = map.get(n.getSuperid());
                treeNode.add(map.get(n.getId()));
                list.remove(n);
            }
        }
        return tree;
    }

    public static final Map<String, DefaultMutableTreeNode> getTreeNodeMap(
            List<Node> nodes) {
        Map<String, DefaultMutableTreeNode> treeNodeMap = new HashMap<>();
        if (nodes == null) {
            return null;
        }
        Iterator I = nodes.iterator();
        while (I.hasNext()) {
            Node n = (Node) I.next();
            treeNodeMap.put(n.getId(), new DefaultMutableTreeNode(n.getId()));
        }
        treeNodeMap.put("root", new DefaultMutableTreeNode("root"));
        return treeNodeMap;
    }

2.编写创建菜单栏的函数。首先介绍采用非递归方法创建菜单栏。该方法中传入的形参为菜单树的根结点,返回值为JMenuBar。

public static JMenuBar createMenu(DefaultMutableTreeNode tree) {
        if (!tree.isRoot()) {
            return null;
        }
        JMenuBar menuBar = new JMenuBar();
        JMenuItem menuItem = null;
        Stack<TreeNode> stack = new Stack<>();
        Map<String, JMenuItem> menuMap = new HashMap<>();
        stack.push(tree);

        while(!stack.empty()) {
            TreeNode popNode = stack.pop();

            if(!((DefaultMutableTreeNode)popNode).isRoot()) {
                if(((DefaultMutableTreeNode)popNode.getParent()).isRoot()) {
                    if(popNode.isLeaf()) {
                        menuItem = new JMenuItem(popNode.toString());
                    } else {
                        menuItem = new JMenu(popNode.toString());
                    }
                    menuBar.add(menuItem);
                } else {
                    if(popNode.isLeaf()) {
                        menuItem = new JMenuItem(popNode.toString());
                    } else {
                        menuItem = new JMenu(popNode.toString());
                    }
                    menuMap.get(popNode.getParent().toString()).add(menuItem);
                }
                menuMap.put(popNode.toString(), menuItem);
            }

            int count = popNode.getChildCount();
            for(int i = 0; i < count; i++) {
                stack.push(popNode.getChildAt(i));
            }
        }

        return menuBar;
    }

3.采用递归方式创建菜单栏。该函数传入的形参为菜单树的根结点和当前菜单的父节点。

public static void createMenu1(DefaultMutableTreeNode node, JComponent jParentMenu) {
        JMenuItem menuItem = null;
        if(!node.isRoot()) {
            if(node.isLeaf()) {
                menuItem = new JMenuItem(node.toString());
            } else {
                menuItem = new JMenu(node.toString());
            }
            jParentMenu.add(menuItem);
        }

        int count = node.getChildCount();
        for(int i = count - 1; i >= 0; i--) {
            createMenu1((DefaultMutableTreeNode)node.getChildAt(i), menuItem == null ? jParentMenu : menuItem);
        }
    }

4.上述方法中采用的菜单结点信息类(Node)如下:该类中实现了Comparable接口,用来排序。

public class Node implements Comparable<Node> {
    private String id;
    private String name;
    private String superid;

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSuperid() {
        return superid;
    }
    public void setSuperid(String superid) {
        this.superid = superid;
    }

    @Override
    public int compareTo(Node o) {
        return this.id.compareTo(o.getId());
    }
}

5.测试方法如下:

public static void main(String[] args) {
        List<Node> list = new ArrayList<Node>();
        Node n = new Node();
        n.setId("01");
        n.setName("01");
        n.setSuperid(null);
        list.add(n);
        n = new Node();
        n.setId("02");
        n.setName("02");
        n.setSuperid(null);
        list.add(n);
        n = new Node();
        n.setId("0102");
        n.setName("0102");
        n.setSuperid("01");
        list.add(n);
        n = new Node();
        n.setId("0101");
        n.setName("0101");
        n.setSuperid("01");
        list.add(n);
        n = new Node();
        n.setId("010101");
        n.setName("010101");
        n.setSuperid("0101");
        list.add(n);
        n = new Node();
        n.setId("010102");
        n.setName("010102");
        n.setSuperid("0101");
        list.add(n);
        n = new Node();
        n.setId("0201");
        n.setName("0201");
        n.setSuperid("02");
        list.add(n);
        n = new Node();
        n.setId("01010201");
        n.setName("01010201");
        n.setSuperid("010102");
        list.add(n);

        Collections.sort(list);

        DefaultMutableTreeNode tree = createTree(list);

        //showTree(tree);
        JMenuBar menuBar = createMenu(tree);
        //JMenuBar menuBar = new JMenuBar();
        //createMenu1(tree, menuBar);
        JFrame frame = new JFrame();
        frame.setJMenuBar(menuBar);
        frame.setSize(600, 400);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }


java利用递归调用实现树形菜单的样式 主要给大家介绍了关于java利用递归调用实现树形菜单样式的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 立即下载

相关推荐

【电机学复习笔记】同步电机的特性及参数的求取

同步电机的主要特性包括:空载特性、短路特性、零功率因数负载特性、外特性和调整特性。 基于以上特性我们可以实现: 从空载特性和短路特性求同步电抗的不饱和值和短路比; 从零功率因数负载特性和空载特性确定保梯电抗(定子漏抗)和电枢反应电动势

Pantrick_的博客 2万+

JAVA JTree 例子 DefaultMutableTreeNode

import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.tree.*; public class Test{ public static void main(String []args) { JFrame treeFrame=new TreeFram...

weixin_41999297的博客 927

ROS1集群通信的可靠升级方案:为什么在无线环境下我选择了swarm_ros_bridge而非原生DDS

本文探讨了ROS1集群通信在无线环境下的可靠升级方案,重点分析了swarm_ros_bridge相较于原生DDS的优势。通过实际案例和性能对比,展示了ZeroMQ在无线通信中的稳定性和高效性,特别适合无人机编队和移动机器人集群等场景。

weixin_42567279的博客 386

Java非递归实现有序菜单树_菜单树的java实现(菜单非递归实现)-Go语言中文社区...

菜单树在web开发中我们经常会遇到菜单的问题,那么如何去实现一个菜单树呢?很多人可能第一反应就是递归,因为菜单是可能是无限级的,那么能不能不用递归就实现一个菜单树呢?要实现的效果图,如下:class ThreeBean{private String id; //节点idprivate String parentId; //父节点idprivate String name; //节点名称priva...

weixin_29938009的博客 387

Jev模型入门:从API接入到本地部署的完整实践指南

大模型的应用方式正从单一聊天窗口转向复杂的自动化工作流,而推理模型因具备指令跟随与结构化输出能力,成为构建Agent和数据处理管线的关键组件。Jev作为面向通用场景的推理模型,不仅提供了OpenAI兼容的API接口,还支持本地量化部署,兼顾隐私、可控性与长期成本。本文从模型定位出发,明确Jev与基座模型的差异,随后介绍密钥管理、API调用、参数调优,并深入演示基于Ollama与llama.cpp的本地部署流程,包括GGUF模型文件与chat template的匹配要点。针对实践中的常见问题,如密钥泄露、ma

weixin_29057237的博客 359

C++ bitset总结

数据结构bitset 术语:某1位置位是置1,某一位复位是某一位清零。 文章目录数据结构bitset一、3种初始化方式二、位访问三、位操作四、 位集操作总结实战练习 一、3种初始化方式 bitset<32> tmp; //默认构造函数,默认全0。 bitset<32> tmp(-1); //从整形数构造 bitset<32> tmp("101"); //从包含1和0的字符串构造 二、位访问 bitset<32> tmp(256)

qq_43807092的博客 721

菜单树的java实现(菜单非递归实现)

菜单树   在web开发中我们经常会遇到菜单的问题,那么如何去实现一个菜单树呢?很多人可能第一反应就是递归,因为菜单是可能是无限级的,那么能不能不用递归就实现一个菜单树呢? 要实现的效果图,如下: class ThreeBean{ private String id; //节点id     private String parentId; //父节点i

xiaoyan_master的博客 3346

排队论 | 排队论建模方法

排队论 | 排队论建模方法

算法如诗的博客 353

Golang非递归构建菜单树(O(n)时间复杂度,任意深度的递归树都能构造,适用于深层、大量数据的树结构构造)

Golang非递归构建菜单树接口及实现

Hami1ton的博客 704

从后端角度浅谈抗辐射设计----三模冗余(TMR)

三模冗余设计(TMR),是最常用的一种容错技术,三个模块采取相同的操作,以多数相同的输出作为表决系统的正确输出,即3取2,因为三个模块是相互独立的,而其中两个模块同时出错的概率是极小的,因此便可保证系统输出的可信度。然而这个设计也会存在面积浪费,功耗的增加,而且由于是冗余的设计,在后续进行综合或者pr的时候会被工具优化,因此需要对模块进行don’t touch设置;通过增值表得到,逻辑关系表达式为:Q=(Q1&Q2)|(Q1&Q3)|(Q2&Q3),通过工艺库的stdcell进行搭建,得到如下电路。

芯冰乐 327

利用插件扩展 Qt 应用程序

不仅 Qt 本身可以通过插件进行扩展,而且 Qt 应用程序也可以通过插件来扩展,这需要应用程序使用 `QPluginLoader` 检测和加载插件。

青春不老,奋斗不止! 1万+

怎么用java实现一二级菜单,以及对应的数据库表怎么设计?

一、引言 怎么实现首页中一二级菜单联动效果?在我们开发过程中经常看到有菜单的出现,一般菜单也是有分类的。一般来说一级菜单下有N个二级菜单,在我们做管理系统的时候菜单是必不可免的。那我们应该怎么去设计数据库表结构呢? 有些同学会说用三张表"父级菜单表"、"子级菜单表"、"中间关系表",用这样的方式去实现。大家有没有觉得这种发式很麻烦呢?那如果我有N级菜单,那是不是就需要建立N张数据库表,而...

贱男 1万+

宇树科技嵌入式面试题及参考答案(春晚机器人的公司)

内存对齐是指在内存中为数据对象分配存储空间时,按照一定的规则将数据存储在特定的地址上,以提高内存访问效率。不同的数据类型在内存中都有其特定的对齐要求,例如,int类型通常要求 4 字节对齐,double类型通常要求 8 字节对齐。这意味着数据的存储地址必须是其对齐字节数的整数倍。如果不进行内存对齐,处理器在访问数据时可能需要进行多次内存访问,从而降低了访问效率。指令可以用于控制结构体内存布局,它允许程序员指定结构体成员的对齐方式。其基本用法是在结构体定义之前使用来指定对齐字节数n,其中n。

大模型大数据攻城狮的专栏 3226

java tree 循环_【java基础 4】树形结构数据呈现的非递归算法(循环)实现

一、基本概况上一篇博客介绍到用递归实现树结构数据的查找,那么这篇博客,我就结合自己对于树的理解,然后用一种非递归的方式进行树结构数据的处理。首先,改造数据库表设计,加入度的概念:首先,layer的设计,是来源于Word文档的目录带来的灵感。想一想我自己在写Word文档的时候,通过标题1,标题2等的设立,然后就可能自动生成目录。我感觉这个和我要完成的树结构数据的处理有共同之处。当然,在这里的0100...

weixin_30636449的博客 493

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【java基础 3】树形结构数据呈现的递归算法实现

一、基本概况 在我的项目中,常常会用到树形结构的数据,最为明显的就是左边菜单栏,类似于window folder一样的东西。 而我之前一直是借助前端封装好的ZTree等工具实现展示,而后台则通常使用递归进行数据的查找。通常,我们在设计数据库表的时候,一般会使用三个字段:id,name,pid。如下图所示: 二、代码实现 首先是建立实体类: private Str

该怎么解释?我懒得解释 1万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

java 树状数据算法_【java基础 3】树形结构数据呈现的递归算法实现

一、基本概况在我的项目中,常常会用到树形结构的数据,最为明显的就是左边菜单栏,类似于window folder一样的东西。而我之前一直是借助前端封装好的ZTree等工具实现展示,而后台则通常使用递归进行数据的查找。通常,我们在设计数据库表的时候,一般会使用三个字段:id,name,pid。如下图所示:二、代码实现首先是建立实体类:private String id;private String n...

weixin_39995439的博客 417

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

树形结构!别再用递归实现了这才是最佳的方案;更快更强更好用

不管你是做前端还是后端的开发,那我相信树形结构的需求一定有遇到过,特别是管理平台类型的项目,一般都会有一个树形结构的菜单栏,再比如说,公司组织架构,层级关系、归属关系等等需求,本质上都是树形结构的一种体现;遇到这种需求,最常见也最容易想到的设计思路就是:父子关系的方式,子项通过一个字段来保存他的父ID,然后通过递归的方式得到层级关系;前几天,技术交流群里面有小伙伴在问,实际的业务中,树形结构的数据太多、层级还深,查询过程一顿递归之后,性能表现得比较差,问有没有什么好的设计思路,让查询、统计更加的便捷高效;今

m0_71777195的博客 850

c++图形界面设计_数据结构课程设计——迷宫求解(一)

前言公众号此前发过一个视频,关于寻找迷宫出路的问题,视频中使用的是深度优先搜索,当然搜索方式有很多,各自也有优缺点,而本系列作为数据结构课程设计的一个制作分享,仅谈论在制作过程中使用到的一些方法,以及课设的完成过程。01分析题目关于数据结构课设,老师提供了七道例题,选题范围包括但不限于此。而我选择了上图中展示的迷宫求解问题。选择题目之后,对题目我标记出的是以下几点只能使用非递归程序需要考...

weixin_28832121的博客 1483

实验五 二叉树的定义与遍历

实验目的: 1.熟悉二叉树的二叉链表存储结构。 2.掌握二叉树的遍历运算。 实验内容: 1.二叉树的链式存储结构(二叉链表)。 2.二叉树的遍历运算(4 种算法)。 3.其它基本运算(选做)。 二叉树调用栈处理先根、中根、后根的非递归算法,使用队列处理层次遍历的非递归算法。 以下是使用先根、中根、后根的递归算法和层次遍历的非递归算法。Node结点类: package ch03;

Unitue_逆流 1027

javaweb中树形结构数据的读取

一、基本概况在我的项目中,常常会用到树形结构的数据,最为明显的就是左边菜单栏,类似于window folder一样的东西。而我之前一直是借助前端封装好的ZTree等工具实现展示,而后台则通常使用递归进行数据的查找。通常,我们在设计数据库表的时候,一般会使用三个字段:id,name,pid。如下图所示:二、代码实现首先是建立实体类:&lt;span style="font-family:KaiTi_...

李云龙的意大利面 4565

数据结构排序第一次输入出错_【46期】盘点那些必问的数据结构算法题之快速排序...

点击上方“Java面试题精选”,关注公众号面试刷图,查缺补漏>>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅。0 概述快速排序也是基于分治模式,类似归并排序那样,不同的是快速排序划分最后不需要merge。对一个数组 A[p..r] 进行快速排序分为三个步骤:划分:数组 A[p…r] 被划分为两个子数组 A[p…q-1] 和 A[q+...

weixin_39590601的博客 171

链表的基本操作_【41期】盘点那些必问的数据结构算法题之链表

点击上方“Java面试题精选”,关注公众号面试刷图,查缺补漏>>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅。0 概述链表作为一种基础的数据结构,在很多地方会用到。如在Linux内核代码,redis源码,python源码中都有使用。除了单向链表,还有双向链表,本文主要关注单向链表(含部分循环链表题目,会在题目中注明,其他情况都是讨论...

weixin_39723441的博客 307

vc6 mscomm getinput() 没有数据_数据结构课程设计——迷宫求解(一)

前言公众号此前发过一个视频,关于寻找迷宫出路的问题,视频中使用的是深度优先搜索,当然搜索方式有很多,各自也有优缺点,而本系列作为数据结构课程设计的一个制作分享,仅谈论在制作过程中使用到的一些方法,以及课设的完成过程。01分析题目关于数据结构课设,老师提供了七道例题,选题范围包括但不限于此。而我选择了上图中展示的迷宫求解问题。选择题目之后,对题目我标记出的是以下几点只能使用非递归程序需要考...

weixin_39570777的博客 280

博客分类管理

越来越感觉自己是有一个强迫症的人,才刚写了shijipi

bbewx的专栏 1452

【备战秋招】每日一题:4月15日美团春招:题面+题目思路 + C++/python/js/Go/java带注释

2023大厂笔试模拟练习网站(含题解)最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据,挂载到我们的OJ上,供大家学习交流,体会笔试难度。现已录入200+道互联网大厂模拟练习题,还在极速更新中。欢迎关注公众号“塔子哥学算法”获取最新消息。提交链接:为了更好的阅读体检,可以查看OJ上的题解。进入提交链接,点击右边菜单栏的"查看塔子哥的题解"

2301_78482949的博客 193
上一篇: Java中的instanceof关键字
下一篇: Java transient关键字解析
bbewx
博客等级 码龄16年 29粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值