Java生成树状菜单结构

核心思想有两点:

   1 实体类的设计,除了基本的属性,还要有子菜单List,如下图

       

   2 就是递归方法的核心思想:

      ①:获取到所有的菜单列表(当然如果是当前用户下的)

      ②:编写递归方法:方法参数两个(1是所有的菜单列表,2是顶级菜单的parentId)

             循环所有菜单列表,判断当前菜单parentId等于传入的parentId,就将此菜单的id当做parentId和所有菜单列表再调用递归,同时将递归的结果存到顶级菜单的childMenus中去,这样既能实现无论有多少级子菜单都能构建成树状,如下图

        

下面贴上源码:

   

public interface SysMenuMapper extends Mapper<SysMenu> {

    /**
     * 获取菜单列表
     * @return
     */
    List<Menu> getMenuList();

}

 

<resultMap id="resultMenu" type="com.zrzrno.common.response.Menu">
  <id column="id" jdbcType="INTEGER" property="id" />
  <result column="name" jdbcType="VARCHAR" property="name" />
  <result column="parent_id" jdbcType="INTEGER" property="parentId" />
  <result column="type" jdbcType="INTEGER" property="type" />
  <result column="permission" jdbcType="VARCHAR" property="permission" />
  <result column="url" jdbcType="VARCHAR" property="url" />
  <result column="order" jdbcType="INTEGER" property="order" />
</resultMap>

<select id="getMenuList" resultMap="resultMenu">
  select m.id,m.name,m.parent_id,m.type,m.permission,m.url,m.order from sys_menu m
</select>

 

//内部方法-递归构建菜单树
private List<Menu> buildMenuTree(List<Menu> menuList, Integer parentId) {
    //最终结果
    List<Menu> resultMenuList = new ArrayList<>();
    for (Menu menu : menuList) {
        if (parentId.equals(menu.getParentId())) {
            menu.setChildMenus(buildMenuTree(menuList,menu.getId()));
            resultMenuList.add(menu);
        }
    }
    return resultMenuList;
}
@Test
void menuTreeTest2() {
    //所有菜单
    List<Menu> rootMenu = this.menuMapper.getMenuList();
    List<Menu> resultMenuList = buildMenuTree(rootMenu, 0);
    System.out.println(resultMenuList);
}

 

以下是效果:

[
    Menu(id=1,
         name=资源管理,
         parentId=0,
         type=0,
         permission=resource,
         url=resource,
         order=1,
         childMenus=[
        Menu(id=4,
             name=资源添加,
             parentId=1,
             type=1,
             permission=resource:insert,
             url=resource,
             order=1,
             childMenus=[
             ]),
    Menu(id=5,
         name=资源修改,
         parentId=1,
         type=1,
         permission=resource:update,
         url=resource,
         order=1,
         childMenus=[
         ]),
Menu(id=6,
     name=资源删除,
     parentId=1,
     type=1,
     permission=resource:del,
     url=resource,
     order=1,
     childMenus=[
     ]),
Menu(id=7,
     name=资源查看,
     parentId=1,
     type=1,
     permission=resource:select,
     url=resource,
     order=1,
     childMenus=[
     ])]),
Menu(id=2,
     name=运营管理,
     parentId=0,
     type=0,
     permission=operation,
     url=operation,
     order=1,
     childMenus=[
    Menu(id=8,
         name=审核管理,
         parentId=2,
         type=0,
         permission=operation:audit,
         url=operation,
         order=1,
         childMenus=[
         Menu(id=10,
         name=实名审核,
         parentId=8,
         type=1,
         permission=operation:audit:certification,
         url=operation,
         order=1,
         childMenus=[
         ]),
Menu(id=11,
     name=资源审核,
     parentId=8,
     type=1,
     permission=operation:audit:resource,
     url=operation,
     order=1,
     childMenus=[
     ])]),
Menu(id=9,
     name=发布管理,
     parentId=2,
     type=0,
     permission=operation:publish,
     url=operation,
     order=1,
     childMenus=[
     ])]),
Menu(id=3,
     name=数据管理,
     parentId=0,
     type=0,
     permission=data,
     url=data,
     order=1,
     childMenus=[
])]
 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java漂亮的树形菜单制作实例(源码),森林的关系图,文本域,用于显示点击的节点名称,使用了JTree,可以看作是一个jTree的用法演示实例。树形菜单应用广泛,这个Tree制作漂亮,相信会让很多朋友从中学习到实现的方法,效果如演示截图所示。下面是相关的代码片段:   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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值