首页 > 编程 > Java > 正文

Java构建树形菜单的实例代码(支持多级菜单)

2019-11-26 11:30:31
字体:
来源:转载
供稿:网友

效果图:支持多级菜单。

菜单实体类:

public class Menu {  // 菜单id  private String id;  // 菜单名称  private String name;  // 父菜单id  private String parentId;  // 菜单url  private String url;  // 菜单图标  private String icon;  // 菜单顺序  private int order;  // 子菜单  private List<Menu> children;  // ... 省去getter和setter方法以及toString方法}

菜单一般需要排序,我们根据Menu的order字段进行排序:

 /*   * 排序,根据order排序   */  public Comparator<Menu> order(){    Comparator<Menu> comparator = new Comparator<Menu>() {      @Override      public int compare(Menu o1, Menu o2) {        if(o1.getOrder() != o2.getOrder()){          return o1.getOrder() - o2.getOrder();        }        return 0;      }    };    return comparator;  }

生成树的方法:

public Map<String,Object> findTree(){  Map<String,Object> data = new HashMap<String,Object>();    try {//查询所有菜单      List<Menu> allMenu = menuDao.findTree();      //根节点      List<Menu> rootMenu = new ArrayList<Menu>();      for (Menu nav : allMenu) {        if(nav.getParentId().equals("0")){//父节点是0的,为根节点。          rootMenu.add(nav);        }      }      /* 根据Menu类的order排序 */      Collections.sort(rootMenu, order());      //为根菜单设置子菜单,getClild是递归调用的      for (Menu nav : rootMenu) {        /* 获取根节点下的所有子节点 使用getChild方法*/        List<Menu> childList = getChild(nav.getId(), allMenu);        nav.setChildren(childList);//给根节点设置子节点      }      /**       * 输出构建好的菜单数据。       *        */      data.put("success", "true");      data.put("list", rootMenu);      return data;    } catch (Exception e) {      data.put("success", "false");      data.put("list", new ArrayList());      return data;    }  }

获取子菜单:

/**   * 获取子节点   * @param id 父节点id   * @param allMenu 所有菜单列表   * @return 每个根节点下,所有子菜单列表   */  public List<Menu> getChild(String id,List<Menu> allMenu){    //子菜单    List<Menu> childList = new ArrayList<Menu>();    for (Menu nav : allMenu) {      // 遍历所有节点,将所有菜单的父id与传过来的根节点的id比较      //相等说明:为该根节点的子节点。      if(nav.ParentId().equals(id)){        childList.add(nav);      }    }    //递归    for (Menu nav : childList) {      nav.setChildren(getChild(nav.getId(), allMenu));    }    Collections.sort(childList,order());//排序    //如果节点下没有子节点,返回一个空List(递归退出)    if(childList.size() == 0){      return new ArrayList<Menu>();    }    return childList;  }

最后返回的JSON串如下:

{ "success": "true", "list": [   {    "id": "1",    "name": "Java",    "parentid": "0",    "url": "http://www.aliouchen.com",    "order": 1,    "children": [     {       "id": "2",       "name": "并发编程",       "parentid": "1",       "url": "http://www.aliouchen.com",       "order": 1,       "children": []     },     {       "id": "3",       "name": "多线程",       "parentid": "1",       "url": "http://www.aliouchen.com",       "order": 2,       "children": [         "id": "4",         "name": "Thread",         "parentid": "3",         "url": "http://www.aliouchen.com",         "order": 1,          "children":[]       ]     }    ]   },   {    "id": "5",    "name": "Python",    "parentid": "0",    "url": "http://www.aliouchen.com",    "order": 2,    "children": []   }  ]}

总结

以上所述是小编给大家介绍的Java构建树形菜单的实例代码(支持多级菜单),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对武林网网站的支持!

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表