Java構(gòu)建樹形菜單的實(shí)例代碼(支持多級(jí)菜單)
效果圖:支持多級(jí)菜單。

菜單實(shí)體類:
public class Menu {
// 菜單id
private String id;
// 菜單名稱
private String name;
// 父菜單id
private String parentId;
// 菜單url
private String url;
// 菜單圖標(biāo)
private String icon;
// 菜單順序
private int order;
// 子菜單
private List<Menu> children;
// ... 省去getter和setter方法以及toString方法
}
菜單一般需要排序,我們根據(jù)Menu的order字段進(jìn)行排序:
/*
* 排序,根據(jù)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();
//根節(jié)點(diǎn)
List<Menu> rootMenu = new ArrayList<Menu>();
for (Menu nav : allMenu) {
if(nav.getParentId().equals("0")){//父節(jié)點(diǎn)是0的,為根節(jié)點(diǎn)。
rootMenu.add(nav);
}
}
/* 根據(jù)Menu類的order排序 */
Collections.sort(rootMenu, order());
//為根菜單設(shè)置子菜單,getClild是遞歸調(diào)用的
for (Menu nav : rootMenu) {
/* 獲取根節(jié)點(diǎn)下的所有子節(jié)點(diǎn) 使用getChild方法*/
List<Menu> childList = getChild(nav.getId(), allMenu);
nav.setChildren(childList);//給根節(jié)點(diǎn)設(shè)置子節(jié)點(diǎn)
}
/**
* 輸出構(gòu)建好的菜單數(shù)據(jù)。
*
*/
data.put("success", "true");
data.put("list", rootMenu);
return data;
} catch (Exception e) {
data.put("success", "false");
data.put("list", new ArrayList());
return data;
}
}
獲取子菜單:
/**
* 獲取子節(jié)點(diǎn)
* @param id 父節(jié)點(diǎn)id
* @param allMenu 所有菜單列表
* @return 每個(gè)根節(jié)點(diǎn)下,所有子菜單列表
*/
public List<Menu> getChild(String id,List<Menu> allMenu){
//子菜單
List<Menu> childList = new ArrayList<Menu>();
for (Menu nav : allMenu) {
// 遍歷所有節(jié)點(diǎn),將所有菜單的父id與傳過來的根節(jié)點(diǎn)的id比較
//相等說明:為該根節(jié)點(diǎn)的子節(jié)點(diǎn)。
if(nav.ParentId().equals(id)){
childList.add(nav);
}
}
//遞歸
for (Menu nav : childList) {
nav.setChildren(getChild(nav.getId(), allMenu));
}
Collections.sort(childList,order());//排序
//如果節(jié)點(diǎn)下沒有子節(jié)點(diǎn),返回一個(gè)空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": "并發(fā)編程",
"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": []
}
]
}
總結(jié)
以上所述是小編給大家介紹的Java構(gòu)建樹形菜單的實(shí)例代碼(支持多級(jí)菜單),希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- 如何實(shí)現(xiàn)java遞歸 處理權(quán)限管理菜單樹或分類
- Java遞歸遍歷樹形結(jié)構(gòu)的實(shí)現(xiàn)代碼
- java實(shí)現(xiàn)構(gòu)造無限層級(jí)樹形菜單
- java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕節(jié)快樂)
- Java Swing中的表格(JTable)和樹(JTree)組件使用實(shí)例
- Java Swing樹狀組件JTree用法實(shí)例詳解
- Java遍歷輸出指定目錄、樹形結(jié)構(gòu)所有文件包括子目錄下的文件
- JSON復(fù)雜數(shù)據(jù)處理之Json樹形結(jié)構(gòu)數(shù)據(jù)轉(zhuǎn)Java對(duì)象并存儲(chǔ)到數(shù)據(jù)庫(kù)的實(shí)現(xiàn)
- Java實(shí)現(xiàn)的決策樹算法完整實(shí)例
- java分類樹,我從2s優(yōu)化到0.1s
相關(guān)文章
Java 利用枚舉實(shí)現(xiàn)接口進(jìn)行統(tǒng)一管理
這篇文章主要介紹了Java 利用枚舉實(shí)現(xiàn)接口進(jìn)行統(tǒng)一管理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02
SpringBoot中MyBatis-Plus 查詢時(shí)排除某些字段的操作方法
這篇文章主要介紹了SpringBoot中MyBatis-Plus 查詢時(shí)排除某些字段的操作方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08
Springboot教程之如何設(shè)置springboot熱重啟
這篇文章主要介紹了Springboot教程之如何設(shè)置springboot熱重啟,本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
SpringCloud修改Feign日志記錄級(jí)別過程淺析
OpenFeign源于Netflix的Feign,是http通信的客戶端。屏蔽了網(wǎng)絡(luò)通信的細(xì)節(jié),直接面向接口的方式開發(fā),讓開發(fā)者感知不到網(wǎng)絡(luò)通信細(xì)節(jié)。所有遠(yuǎn)程調(diào)用,都像調(diào)用本地方法一樣完成2023-02-02
java泛型的局限探究及知識(shí)點(diǎn)總結(jié)
在本篇內(nèi)容里小編給大家分享的是一篇關(guān)于java泛型的局限探究及知識(shí)點(diǎn)總結(jié)內(nèi)容,有需要的朋友們可以跟著學(xué)習(xí)參考下。2021-07-07
Java設(shè)計(jì)模式之建造者模式實(shí)例詳解
這篇文章主要介紹了Java設(shè)計(jì)模式之建造者模式,結(jié)合具體實(shí)例形式分析了建造者模式的概念、原理、實(shí)現(xiàn)方法與相關(guān)使用注意事項(xiàng),需要的朋友可以參考下2017-09-09

