Java構建樹形菜單

構建樹形菜單編程

效果圖:支持多級菜單。多線程

 

菜單實體類:併發

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字段進行排序:ide

/*
     * 排序,根據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;
    }

生成樹的方法:url

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": []
      }
    ]
}
相關文章
相關標籤/搜索