menu tree ul li

Buenas estoy estoy haciendo un menu de tres niveles en java y estoy tratando de construirlo con un bean

Estos son los datos

idmodulo	titulomenuitem	parent_id	path navegation
1	        Autos	         0	                 #
2	        Honda	         1	         honda.html
3	        Toyota               1	                #
4	        Cilindros	         3	                #
5	        Camiones           0	                #
public class menuBean {
       
        private String screen;
        private String parentid;
        private String titulomenu;
        private int orden;
        private String link;
       
        public String getScreen() {
                return screen;
        }
        public void setScreen(String screen) {
                this.screen= screen;
        }
....///getters and setters

En esta parte es poblado

....
Statement st = con.createStatement();
                    ResultSet rs = st.executeQuery("select * from menus ");
                    lstmenu = new ArrayList<menuBean>();
                    while(rs.next()){
                       
                        bean = new menuBean();
                       
                        bean.setScreen(rs.getString("id_modulo"));
                        bean.setPadre(rs.getString("parent_id"));
                        bean.setTitulomenu(rs.getString("nombre"));
                        bean.setOrden(rs.getInt("orden"));
                        bean.setLink(rs.getString("link"));
                        lstmenu.add(bean);

                    }

return build_menu(lstmenu,"0");

Y en esta parte lo intento construir

public static boolean has_children(List<menuBean> bean,String id) {
                  for (menuBean it : bean) {
                    if (it.getParentId() == id)
                      return true;
                  }
                  return false;
                }
       
        public static String build_menu(List<menuBean> lstmenu,String parent)
        {  
          StringBuffer menu = new StringBuffer();      
          String menus="";
          menus= menus+"<ul>";
         
          for (menuBean items : lstmenu)
          {
            if (items.getParentId().equals(padre)){
              menus= menus+ "<li>"+items.getTitulomenu();
              if (has_children( lstmenu,items.getScreen())){
                 
                menus=menus+ build_menu((List<menuBean>) lstmenu,items.getPantalla());
              menus=menus+ "</li>";}
            }
          }
          menus=menus+ "</ul>";

          return menus;
        }

Pero aun no comprendo porque no me pinta todos los niveles , les agradeceria su consejo

Saludos , gracias

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Re: menu tree ul li

 

En realidad, el código es mucho más simple. Ejemplo:

public static void main(String[] args) {
    List<MenuBean> list = new ArrayList<>();
    list.add(new MenuBean("1", "Autos", "0", "#"));
    list.add(new MenuBean("2", "Honda", "1", "#honda.html"));
    list.add(new MenuBean("3", "Toyota", "1", "#"));
    list.add(new MenuBean("4", "Cilindros", "3", "#"));
    list.add(new MenuBean("5", "Camiones", "0", "#"));
    StringBuilder sb = new StringBuilder();
    buildMenu(sb, list, "0");
    System.out.println(sb.toString());
}

public static void buildMenu(StringBuilder sb, List<MenuBean> list, String id) {
    sb.append("<ul>");
    for (MenuBean bean : list) {
        if (bean.getParentid().equals(id)) {
            sb.append("<li>");
            sb.append(bean.getTitulomenu());
            buildMenu(sb, list, bean.getScreen());
            sb.append("</li>");
        }
    }
    sb.append("</ul>");
}

Salida:

  • Autos
    • Honda
      • Toyota
        • Cilindros
      • Camiones

        Te recomiendo ampliamente que utilices las Java Code Conventions [PDF]. Versión en español: Convenciones de Código para el lenguaje de programación JAVA [PDF]

        ~~~

        Gracias por la respuesta,

        Gracias por la respuesta, pero no me salio , en el ejemplo que coloque yo no me muestra los hijos solo me arroja los padres, y en el caso de que quisera hacerlo un array de arrays de bean , se podria?

        • Autos
        • Camiones

        gracias nuevamente

        Saludos

        Re: no me salio

        Gracias por la respuesta, pero no me salio

        ¡Ah! Aquí puedes encontrar el código completo del ejemplo de mi respuesta.

        en el ejemplo que coloque yo no me muestra los hijos solo me arroja los padres

        Utilizas el operador == para comparar dos cadenas cuando debes usar el método equals correspondiente.

        y en el caso de que quisera hacerlo un array de arrays de bean , se podria?

        Supongo que sí. Sin embargo, utilizar un arreglo de varias dimensiones para contruir un “menú” añade complejidad innecesaria.

        ~~~

        Y en el caso de querer

        Y en el caso de querer agregarle classes como dropdown , ahi usaria el nivel ? es lo que pense de un array no se si lo facilitaria mas les agradezco sus sugerencias,gracias

        Saludos al foro

        Re: dropdown

        Y en el caso de querer agregarle classes como dropdown , ahi usaria el nivel ?

        ¿Te refieres a algo como lo siguiente?

        View the pure CSS dropdown menu demo

        En caso de que así sea, no me parece que un arreglo de varias dimensiones facilite el asunto en lugar de una lista (o un arreglo de una dimensión) de MenuBean‘s.

        ~~~

        Si, asi es como la imagen que

        Si, asi es como la imagen que adjuntaste, una lista? no entendi bien , te agradezco nuevamente

        yo estaba haciendo esto:

        public static void buildMenu(StringBuilder sb, List<menuBean> list, String id) {
                    sb.append("<ul>");
                   
                   
                    for (menuBean bean : list) {
                       
                        if (bean.getPadre().equals(id)) {
                            if(bean.getNivel()==1){
                               
                                sb.append("<li >");
                                //sb.append("<a href=\"#\" class=\"dropdown-toggle\" data-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\">");
                            }
                            sb.append(bean.getTitulomenu());
                            if(bean.getNivel()==1){
                                sb.append("<span ></span></a>");
                            }
                            buildMenu(sb, list, bean.getPantalla());
                           
                            sb.append("</li>");
                        }
                    }
                    sb.append("</ul>");
                   
                   
                }

        pero si al querer modificar un css o agregar algo mas pues tendria que modificar el codigo, agradezco sugerencias

        gracias nuevamente

        menu tree ul li

        Buenas pase la lista un tipo json, y lo hice desde javascript espero le pueda servir a alguien

        $(document).ready(function() { 

        var arraylst = [{ "pantalla":"1","padre":"0","titulomenu":"Autos","orden":1,"path":"#","nivel":1},{"pantalla":"2","padre":"1","titulomenu":"Honda","orden":2,"ruta":"Honda.html","nivel":2}.........];

                function has_childrenSize (arraylistmenu,id,arraytemp){
                                var cont=0;
                       
                                arraylistmenu.forEach(function(item){
                               
                                if(item.padre == id){
                                        cont++;
                                }
                        });
                       
                        return cont;
                }

        function buildMenu(sb,arrayobjmenu,id,level){
                sb="";
                      arrayobjmenu.forEach(function(bean){
                          if (bean.padre===id) {
                             if(bean.nivel==1){
                               
                                      sb+="<li >";
                                      sb+="<a href=\"#\" class=\"dropdown-toggle\"  data-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\">";
                                      sb+=bean.titulomenu;
                                      sb+="<span class=\"caret\"  ></span></a>";
                               
                                     var sizelst = has_childrenSize(arrayobjmenu, bean.pantalla, arraytmpmenu);
                                     sb+= (sizelst>0)?"<ul class=\"dropdown-menu multi-level\" role=\"menu\" aria-labelledby=\"dropdownMenu\">":"";
                               
                            }else if(bean.nivel==2){
                                               
                                    var sizelst = has_childrenSize(arrayobjmenu, bean.pantalla, arraytmpmenu);

                                    sb+= (sizelst>0)?"<li class=\"dropdown-submenu\">":"<li>";
                               
                                    sb+= (sizelst==0)?"<a href=\"#\" "+((bean.path=="#")?">":"onclick=abrirPagina(\""+bean.path+"\") >"):"<a  tabindex=\"-1\" href=\"#\">";
                                               
                                    sb+=bean.titulomenu;
                                    sb+="</a>";
                                    sb+= (sizelst>0)?"<ul class=\"dropdown-menu\">":"";
                               
                            }else if(bean.nivel==3){
                               
                                  sb+="<li >";
                                  sb+="<a tabindex=\"-1\" >";
                                  sb+=bean.titulomenu;
                                  sb+="</a>";
                               
                            }
                                       
                                  sb+= buildMenu(sb, arrayobjmenu, bean.pantalla,bean.nivel);
                            if(bean.nivel==2 ){
                                       
                                    var sizelst = has_childrenSize(arrayobjmenu, bean.pantalla);
                           
                                    sb+= (sizelst>0)?"</ul>":"";
                                    sb+=("</li>");
                            }
                            else if(bean.nivel==1){
                               
                                    var sizelst = has_childrenSize(arrayobjmenu, bean.pantalla, arraytmpmenu);
                                 
                                    sb+= (sizelst==0)?"</li>":"</ul></li>";
                            }else if(bean.nivel==3){
                                   sb+="</li>";
                            }
                         
                         
                          }
                  });
                return sb;
               
                }

        document.getElementById('m_menu').innerHTML = buildMenu(sb,arraylst,"0",1,arrlis);

        ........

        Y en el html coloque:

        <ul id="m_menu"></ul>