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

菜单树

  在web开发中我们经常会遇到菜单的问题,那么如何去实现一个菜单树呢?很多人可能第一反应就是递归,因为菜单是可能是无限级的,那么能不能不用递归就实现一个菜单树呢?

要实现的效果图,如下:



class ThreeBean{ 
    private String id; //节点id
    private String parentId; //父节点id 
    private String name;  //节点名称
    private List<ThreeBean> children = new ArrayList<ThreeBean>();//子节点
    private Double count; //节点对应的数量
    private Boolean expanded=false;//是否有子节点
    public static void main(String[] args) {
        Map<String,ThreeBean> nodeListMap = new HashMap<String,ThreeBean>();
        ThreeBean root=new ThreeBean("0",null,"根节点",0D); 
        nodeListMap.put(root.getId(), root);
        ThreeBean a1=new ThreeBean("1","0","节点1",0D);
        nodeListMap.put(a1.getId(), a1);
        ThreeBean a2=new ThreeBean("2","0","节点2",0D);
        nodeListMap.put(a2.getId(), a2);
        ThreeBean a3=new ThreeBean("3","1","节点3",0D);
        nodeListMap.put(a3.getId(), a3);
        ThreeBean a4=new ThreeBean("4","2","节点4",0D);
        nodeListMap.put(a4.getId(), a4);
        ThreeBean a5=new ThreeBean("5","2","节点5",0D);
        nodeListMap.put(a5.getId(), a5);
        ThreeBean a6=new ThreeBean("6","3","节点6",1D);
        nodeListMap.put(a6.getId(), a6);
        ThreeBean a7=new ThreeBean("7","3","节点7",2D);
        nodeListMap.put(a7.getId(), a7);
        ThreeBean a8=new ThreeBean("8","3","节点8",3D);
        nodeListMap.put(a8.getId(), a8);
        ThreeBean a9=new ThreeBean("9","4","节点9",4D);
        nodeListMap.put(a9.getId(), a9);
        ThreeBean a10=new ThreeBean("10","4","节点10",5D);
        nodeListMap.put(a10.getId(), a10);
        ThreeBean a11=new ThreeBean("11","4","节点11",6D);
        nodeListMap.put(a11.getId(), a11);
        ThreeBean a12=new ThreeBean("12","4","节点12",7D);
        nodeListMap.put(a12.getId(), a12);
        ThreeBean a13=new ThreeBean("13","5","节点13",8D);
        nodeListMap.put(a13.getId(), a13);
        ThreeBean a14=new ThreeBean("14","5","节点14",9D);
        nodeListMap.put(a14.getId(), a14);
        for (String key:nodeListMap.keySet())
        {
            ThreeBean nodeData = nodeListMap.get(key);
            //主键是空的则为根目录 根据自己情况定义根目录
            if (nodeData.getParentId() == null || nodeData.getParentId().equals("")) {
                root = nodeData;
                root.setExpanded(true);
            }
            else
            {
                //根据该目录的父节点组合其子节点集合
                ThreeBean zTreeDataInfo =nodeListMap.get(nodeData.getParentId());
                zTreeDataInfo.getChildren().add(nodeData);
                zTreeDataInfo.setExpanded(true);
            }
        }

//到这里的话 我们就构造了完了 二叉树

        ObjectMapper mapper = new ObjectMapper();
        String json = null;
  root=count(root);
        try {
            json = mapper.writeValueAsString(root);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        System.out.println(json);
    }
private static ThreeBean count(ThreeBean root){//递归给节点赋值
        Double total = root.getCount();
    if(root.getChildren().size() < 1){
        root.setCount(total);
        return root;
    }
    Double sum = total;
    for(ThreeBean child : root.getChildren()){
        ThreeBean tmp = count(child);
        sum += tmp.getCount();
    }
    root.setCount(sum);
    return root;

    }
}


 

 
总结:这种实现菜单树的方法应该要比递归简单容易理解。


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); //在文本域中显示名称   }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值