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 #
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);
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>";
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
- Inicie sesión o regístrese para enviar comentarios
Re: menu tree ul li
En realidad, el código es mucho más simple. Ejemplo:
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:
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?
gracias nuevamente
Saludos
Re: no me salio
¡Ah! Aquí puedes encontrar el código completo del ejemplo de mi respuesta.
Utilizas el operador
==
para comparar dos cadenas cuando debes usar el métodoequals
correspondiente.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
¿Te refieres a algo como lo siguiente?
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:
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
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: