como recorrer un checboxtree

Estoy ocupando este jtree con checkbox para dar privilegios a usuarios dentro de un sistema, programando en java con base de datos mysql

como recorrer y determinar que checkbostree a sido seleccionado...
Tengo un jtreecheckbox que lo cargo de la base de datos ocupando tres tablas mas que nada son 5 tablas..
la primera tabla es de
1 tbl_menu
2 tbl_opciones
3 tbl_operaciones

estas tablas se componen de dos campos, la clave o id, y un campo descripción

tabla 1 almaceno lo que son los menús de mi programa
1- Archivo
2- Iniciar sesión
3- Cerrar sesión
4- Catálogos.
5- Asignaciones
6- Ajustes

tabla 2 almaceno las opciones
1- Empresas
2- Sucursales
3- Empleados
4- Puestos
5- Asignar puesto
6- Reportes

tabla 3 aquí es donde se guardar todas las operaciones que puede hacer un usuario

1- Registrar
2- Actualizar
3- Eliminar
4- Generar reporte
5- Imprimir
6.- Generar otras claves
etc
---------------------------------------------------------------------------------------------------------------------------------

tengo dos tablas mas que relaciono la 2 tabla con la tercera

4 tbl_opcion_oper en esta tabla se relaciona con tbl_opciones, y tbl_operaciones

quedando de la siguiente forma ya relacionado aquí tomando en cuenta que la primera columna es el id_ llave primaria, el segundo campo es se relaciona con el ide de la tabla opciones y la tercera con la tabla operaciones, estos dos últimos campos almacenan las claves foraneas

1,1,1
2,1,2
3,1,3
4,2,1
5,2,2
6,2,3

4.- tbl_menu_opciones la tercera tabla la cual se relaciona la tabla anterior que es la 4 con la primera tabla que es de tbl_menu
quedando dela siguiente forma; compuesto por 3 campos la primera es el id de la tabla es la llave primaria, el siguiente campo es la que se relaciona con la tabla tbl_menu, y el ultimo campo se relaciona con la tabla tbl_opcion_oper, estos dos ultimos campos almacenan las claves foráneas..

aclaro que las primeras 3 opciones del menú no se relacionan con ninguna de la tabla opciones ni operación (se relaciona directamente con la tavla tbl_menu_opciones

quedando de la siguiente manera

1, 1, null
2, 2, null
3, 3, null
4, 4, 1
5, 4, 2
6, 4, 3

asi sucesivamente va..

al final tengo una vista la cual muetro todo..

al cargar el jtre con la base de datos queda asi.....

  • http://sia1.subirimagenes.net/img/2015/06/06/150606035528107877.png
  • http://sia1.subirimagenes.net/img/2015/06/06/150606035530161809.png
  • http://sia1.subirimagenes.net/img/2015/06/06/150606035531145184.png
  • http://sia1.subirimagenes.net/img/2015/06/06/150606035532489044.png

  • http://sia1.subirimagenes.net/img/2015/06/06/150606035532489044.png
  • bueno lo que no se como recorrer todo el arbol y determinar los checbox seleccionado o marcado
    y asi obtener el ide de la hoja seleccionado.. y guardarlo en una tabla que seran los privilegios y posteriormente relacionarlo con la tabla de usuarios que accesen al sistema

    tengo este pequeño codigo que hace eso pero solo lo seleccionado, y recoje los nombres como quiero.. pero seria de uno en uno

    public void determinar_seleccionado(){
            try {
                DefaultMutableTreeNode nseleccionado = (DefaultMutableTreeNode) jtreecheck.getLastSelectedPathComponent();
                JOptionPane.showMessageDialog(frame, nseleccionado.getPath(), "Atencion", JOptionPane.PLAIN_MESSAGE);
            } catch (Exception e) {
                System.out.println(e);
            }
        }

    y lo muestra asi

  • http://sia1.subirimagenes.net/img/2015/06/06/150606045012974941.png
  • pero lo que yo quiero es como acer unrecorrido total para sacar todos los datos seleccionados, y posteriormente hacer una consulta a la base de datos y objetner los ide de la tabla tbl_menu_operaciones y esto guardarlo en una tabla de privilegios
    tengo este codigo para obetener todos los contenidos del arbol

    el codigo es lo siguiente

      public void imprimirRecorridoProfundidad(JTree tree) {
            String output = "";
            TreePath selected ;
            DefaultMutableTreeNode root = (DefaultMutableTreeNode) (tree.getModel().getRoot());
            Enumeration<?> enumeration = root.depthFirstEnumeration();
            System.out.println("Recorrido por Profundudidad es: ");
            int i=0;
            while (enumeration.hasMoreElements()) {
                output = enumeration.nextElement().toString() + " ";
                selected = tree.getSelectionPath();
                System.out.println(i + " . " + output);
                i++;
            }
        }  

    la salida es esto, pero no me muestra los nodos principales de cada seccion

  • http://sia1.subirimagenes.net/img/2015/06/06/150606050308760572.png
  • espero que me den ideas como hacerle..
    y me echen la mano, esque asignar privilegios de este modo es complicado, mas manejando jtree

    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: como recorrer un checboxtree

     

    Aquí hay un ejemplo de recorrido de un CheckboxTree:

    import it.cnr.imaa.essi.lablib.gui.checkboxtree.CheckboxTree;
    import it.cnr.imaa.essi.lablib.gui.checkboxtree.TreeCheckingModel.CheckingMode;

    import java.util.HashMap;
    import java.util.Map;

    import javax.swing.JOptionPane;
    import javax.swing.JScrollPane;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.tree.TreePath;

    public class Main {

        static class Skill {
            private final int id;
            private final int parentId;
            private final String title;
            public Skill(int id, String title, int parentId) {
                this.id = id;
                this.title = title;
                this.parentId = parentId;
            }
            public int getId() {
                return id;
            }
            public int getParentId() {
                return parentId;
            }
            public String getTitle() {
                return title;
            }
            @Override
            public String toString() {
                return title;
            }
        }

        public static void main(String[] args) {

            Map<Integer, Skill> skills = new HashMap<>();
            skills.put(1, new Skill(1, "Puedo programar", 0));
            skills.put(2, new Skill(2, "en Ceylon", 1));
            skills.put(3, new Skill(3, "en Java", 1));
            skills.put(4, new Skill(4, "en C#", 1));
            skills.put(5, new Skill(5, "en VB", 1));
            skills.put(6, new Skill(6, "Se usar", 0));
            skills.put(7, new Skill(7, "IntelliJ IDEA", 6));
            skills.put(8, new Skill(8, "eclipse", 6));
            skills.put(9, new Skill(9, "NetBeans", 6));
            skills.put(10, new Skill(10, "JDeveloper", 6));

            DefaultMutableTreeNode root = new DefaultMutableTreeNode(new Skill(0, "Mis 'Skills'", -1));
            buildTree(skills, root);
            CheckboxTree tree = new CheckboxTree(root);
            tree.expandAll();
            tree.getCheckingModel().setCheckingMode(CheckingMode.PROPAGATE_PRESERVING_CHECK);
            JOptionPane.showMessageDialog(null, new JScrollPane(tree));
            printTree(tree, root);
        }

        private static void buildTree(Map<Integer, Skill> skills, DefaultMutableTreeNode root) {
            for (Skill power : skills.values()) {
                if (power.getParentId() == ((Skill) root.getUserObject()).getId()) {
                    DefaultMutableTreeNode node = new DefaultMutableTreeNode(power);
                    root.add(node);
                    buildTree(skills, node);
                }
            }
        }

        private static void printTree(CheckboxTree tree, DefaultMutableTreeNode node) {
            if (node.isLeaf()) {
                Skill power = (Skill) node.getUserObject();
                boolean selected = tree.isPathChecked(new TreePath(node.getPath()));
                System.out.printf("%s: %s%n", power, selected);
            }
            for (int i = 0; i < node.getChildCount(); i++) {
                printTree(tree, (DefaultMutableTreeNode) node.getChildAt(i));
            }
        }

    }

    Ejemplo de CheckboxTree

    ¡Por si sirve de algo!

    ~~~

    Imagen de pechsclk

    ejemplo de recorrido de un CheckboxTree

    jpaul justo lo que necesito para hacer el recorrido y determinar los checkbox de cada nodo si esta seleccionado...
    pero aun me surgen dudas como obtener los id's correspondientes para guardar en una tablamuy aparte.....
    nuca he trabajado...con este componente..

    Re: id

     

    En mi ejemplo, la clase Skill funge como modelo y contiene el id. Tiene sobreescrito el método toString para mostrar el texto correspondiente en el menú.

    Cada nodo se contruye utilizando una instancia de tal clase:

    Y cuando se recorre, el id se obtiene:

    Skill power = (Skill) node.getUserObject();
    boolean selected = tree.isPathChecked(new TreePath(node.getPath()));
    System.out.printf("%s: %s%n", power.getId(), selected);

    ~~~

    Imagen de pechsclk

    lo checare

    lo checare porque bien, porque tu lo cargas con parametro.. como un ArraList para despues ponerlo en el modelo del jtree

    skills.put(1, new Skill(1, "Puedo programar", 0));

    adecuenta que el ide de cada nodo ya esta en cada nodo... o me equivoco....
    bueno yo las cargue de diferente forma con respecto a la tabla de la base de datos fui cargando los nodos..
    aki el codigo

    public void cargar_privilegios() {
            DefaultMutableTreeNode privilegio = new DefaultMutableTreeNode("Privilegios");
            DefaultTreeModel modelo = new DefaultTreeModel(privilegio);
            DefaultMutableTreeNode menu;
            DefaultMutableTreeNode opcion;
            DefaultMutableTreeNode oper;
           
            Object[][]Menus = datos_menu();
            Object[][]Opcion =null;
            Object[][]Operacion =null;
            for(int i = 0; i < Menus.length; i++){
                menu = new DefaultMutableTreeNode(Menus[i][1]);
                privilegio.add(menu);
                Opcion = datos_opcion(Menus[i][0].toString());
                for(int j = 0; j < Opcion.length; j++){
                    opcion = new DefaultMutableTreeNode(Opcion[j][1]);
                    menu.add(opcion);
                    Operacion = datos_operacion(Opcion[j][0].toString());
                    for(int k = 0; k < Operacion.length; k++){
                        oper = new DefaultMutableTreeNode(Operacion[k][1]);
                        opcion.add(oper);
                    }
                }
            }  
            this.jtreecheck.setModel(modelo);
        }

    pero igual. lo analizare..bien... porque he estado dando de topes a la cabeza

    Re: ArraList

     

    Por cierto, tal vez quieras también mostrar aquellas opciones que ya antes habías seleccionado (guardado en la base de datos) para modificarlas. Siguiendo el mismo ejemplo:

    public static void main(String[] args) {
        // Options available
        List<Skill> skills = new ArrayList<>();
        skills.add(new Skill(1, "Puedo programar", 0));
        skills.add(new Skill(2, "en Ceylon", 1));
        skills.add(new Skill(3, "en Java", 1));
        skills.add(new Skill(4, "en C#", 1));
        skills.add(new Skill(5, "en VB", 1));
        skills.add(new Skill(6, "Se usar", 0));
        skills.add(new Skill(7, "IntelliJ IDEA", 6));
        skills.add(new Skill(8, "eclipse", 6));
        skills.add(new Skill(9, "NetBeans", 6));
        skills.add(new Skill(10, "JDeveloper", 6));

        // Build tree
        DefaultMutableTreeNode root = new DefaultMutableTreeNode(new Skill(0, "Mis 'Skills'", -1));
        buildTree(skills, root);
        CheckboxTree tree = new CheckboxTree(root);
        tree.expandAll();
        tree.getCheckingModel().setCheckingMode(CheckingMode.PROPAGATE_PRESERVING_CHECK);

        // Select old paths
        List<Integer> ids = Arrays.asList(3, 8, 9);
        List<TreePath> previousSelection = getPreviousSelection(tree, root, ids);
        tree.setCheckingPaths(previousSelection.toArray(new TreePath[previousSelection.size()]));

        // Show and edit
        JOptionPane.showMessageDialog(null, new JScrollPane(tree));
        printTree(tree, root);
    }

    private static void buildTree(List<Skill> skills, DefaultMutableTreeNode root) {
        for (Skill power : skills) {
            if (power.getParentId() == ((Skill) root.getUserObject()).getId()) {
                DefaultMutableTreeNode node = new DefaultMutableTreeNode(power);
                root.add(node);
                buildTree(skills, node);
            }
        }
    }

    private static void printTree(CheckboxTree tree, DefaultMutableTreeNode node) {
        if (node.isLeaf()) {
            Skill power = (Skill) node.getUserObject();
            boolean selected = tree.isPathChecked(new TreePath(node.getPath()));
            System.out.printf("%s: %s%n", power.getId(), selected);

        }
        for (int i = 0; i < node.getChildCount(); i++) {
            printTree(tree, (DefaultMutableTreeNode) node.getChildAt(i));
        }
    }

    private static List<TreePath> getPreviousSelection(CheckboxTree tree, DefaultMutableTreeNode node, List<Integer> ids) {
        List<TreePath> list = new ArrayList<>();
        Skill power = (Skill) node.getUserObject();
        if (ids.contains(power.getId())) {
            list.add(new TreePath(node.getPath()));
        }
        for (int i = 0; i < node.getChildCount(); i++) {
            list.addAll(getPreviousSelection(tree, (DefaultMutableTreeNode) node.getChildAt(i), ids));
        }
        return list;
    }

    ~~~

    Imagen de pechsclk

    Me marca errores

    en tu segundo ejemplo me carga error en

    List<Skill> skills = new ArrayList<>();

    esto es lo que me marca
    Tipo de Lista no toma parámetros

    List<Integer> ids = Arrays.asList(3, 8, 9);
        List<TreePath> previousSelection = getPreviousSelection(tree, root, ids);

    con el mismo eror

    la linea
    private static void buildTree(List<Skill> skills, DefaultMutableTreeNode root) marca el mismo error de  Tipo de Lista no toma parámetros
    private static void buildTree(List<Skill> skills, DefaultMutableTreeNode root) {
        for (Skill power : skills) {
            if (power.getParentId() == ((Skill) root.getUserObject()).getId()) {
                DefaultMutableTreeNode node = new DefaultMutableTreeNode(power);
                root.add(node);
                buildTree(skills, node);
            }
        }
    }

    por ultimo estas dos lineas marca lo mismo

    private static List<TreePath> getPreviousSelection(CheckboxTree tree, DefaultMutableTreeNode node, List<Integer> ids) {
        List<TreePath> list = new ArrayList<>();
    Imagen de pechsclk

    Hice unas modificaciones y ya salio bueno en el ejemplo

    estas son las modificaciones que hice

    Antes taba asi

    List<Integer> ids = Arrays.asList(3, 8, 9);

    ahora lo puse asi

    ArrayList<Integer> ids = new ArrayList(Arrays.asList(3, 8, 9));

    y donde tenias List nomas le agrege ArrayList solamente asi me dejo de marcar error

    Re: error

    Seguramente el IDE importó la clase java.awt.List en lugar de java.util.List. Código completo aquí external.

    Imagen de pechsclk

    Seguramente el IDE importó la clase java.awt.List

    Si ya vi que si funciona asi como posteaste el ejemplo.. si importo diferente mi ide....
    pero segire checando esto con la base de datos

    Imagen de pechsclk

    Cargue Jtree con base de datos

    Cargue el JTreeCheck con base de datos, asi como en el ejemplo

  • http://sia1.subirimagenes.net/img/2015/06/18/150618104737214382.png
  • logre cargarlo con base de datos como realmente quiero, ya los ids principal de cada opcion ya esta cargado.. asi nomas seleccionar, pues se obtendria el id_principal para guardar en una tabla los id_seleccionados, junto con la clave de usuarios..

    hasta aqui todo bien...
    pero me a sugido un inconveniente.. aki la imagen

  • http://sia1.subirimagenes.net/img/2015/06/18/150618105446380495.png
  • Si selecciono el nodo el menu Asignaciones, y posteriormente la opcion Asignaciones, y posterior mente las operaciones ya aparecen seleccionados, hasta ahi todo bien no, pero suponiendo que no se quiere dar todas esas operaciones de Asignar, Reasignar, Generar codigo manual, al deseleccionar unas de esas operaciones. se desactiva el modo principal que esta en el primer nivel y el segundo nivel, y esto no deveria aser, alguna idea de como controlar esto....

    Re: se desactiva

    … se desactiva el modo principal que esta en el primer nivel y el segundo nivel, y esto no deveria aser, alguna idea de como controlar esto....

    Cambia el CheckingMode:

    tree.getCheckingModel().setCheckingMode(CheckingMode.PROPAGATE_PRESERVING_UNCHECK);

    img

    P.D. Esto es utilizando lablib-checkboxtree-3.3.jar de http://bit.ly/1dM5wkR icon.

    ~~~

    Imagen de pechsclk

    porque no me toma en cue ta los nodos

    porque no toma en cuanta los nodos que estan seleccionados...

    Imagen de pechsclk

    al parecer lo que deseaba lo corregir de este modo

    al momento de hacer la comparacion en
    del nodo lo cambie de la siguiente forma

          if (node.isLeaf()) {

    lo cambie a esta forma

    if (node.getAllowsChildren()) {
    }

    y asi me toma en cuenta en nodo

    Imagen de pechsclk

    al parecer lo que deseaba lo corregir de este modo

    al momento de hacer la comparacion en
    del nodo lo cambie de la siguiente forma

          if (node.isLeaf()) {

    lo cambie a esta forma

    if (node.getAllowsChildren()) {
    }

    y asi me toma en cuenta en nodo

    Re: nodos

    … no toma en cuanta los nodos que estan seleccionados…

    Cada hoja debería ser un privilegio y los nodos, sólo la forma de clasificarlos, no un privilegio en sí mismo.

    Imagen de pechsclk

    Cada nodo deberia ser un provilegio

    tienes razón los nodos es una clasificación
    porque con este codigo

    CheckingMode.PROPAGATE_PRESERVING_CHECK

    al momento de cargar al usuario con sus privilegios desde la base de datos, para hacerle un cambio o agregarle un privilegio mas.. no se mostraría el nodo seleccionado en el árbol.
    pero con este código si

    CheckingMode.PROPAGATE_PRESERVING_UNCHECK

    -------------------------------------------------------------------------------------------------------------------------------------------------------
    lo que yo pienso tomar el nodo como un item en mi menu principal, y si ese nodo fue tomado como true o false, pues lo mostraria habilitado o deshabilitado...

    Re: habilitado o deshabilitado

     

    En mi opinión, no deberían mostrarse. ¡A menos que el cliente lo pida! No obstante, si muestras algo deshabilitado, eso significa que el usuario debe hacer algo para habilitarlo. Ejemplo:

    img


    P.D.: Te recomiendo el libro Designing Interfaces, 2nd Edition de Jenifer Tidwell. Hay una vista previa en Google Books. También está el sitio web del libro.

    ~~~

    Imagen de pechsclk

    En mi opinión, no deberían mostrarse.

    Si comprendo, que el usuario final se sorprendería el porque esta deshabilitado esa opción o el menú esta deshabilitado...
    lo que quiero como resultado final en mi ventana principal las opciones del menú, se activen de acuerdo al privilegio.
    aquí la imagen

  • http://sim1.subirimagenes.net/img/2015/06/23//150623070304498608.png
  • ahora que ya estoy implementado, creo que ya me salieron otras dudas.
    ya construí la tabla de usuarios y la tabla de privilegios, la cual la.
    tbl_user tiene 4 campos
    clav_user int incremental llave primaria
    nombre varchar
    user varchar
    contra longblob
    y posteriormente tengo la tabla de privilegios con 4 campos

    tbl_privilegios
    clav_privilegio int auto_increment llave primaria
    clav_user int
    clav_menuopc int
    privilegio bit
    en la cual se guardar de esta forma

    la clave de usuario, la clave del menu_opcion, y el privilegio si fue seleccionado captura un true, de lo contrario un false, hasta aquí todo bien.
    cuando yo quiera actualizar los privilegios..al usuario. no se 1semana después deseo agregarle otras o quitarle algunos.. pues es necesario..
    bueno aquí ya me enrede..
    cuando guardo los privilegios, recorro todo el árbol.. y extraigo todos los ids, del árbol y posteriormente si esta seleccionado, ya vez que retorna un false, o un true, capturo estos boleanos que lo guardo en un campo bit, que ocuparía para activar los menús item en mi ventana principal, los opciones.
    --------------------------------------------------------------------------------
    bueno dependiendo de usuario y la clave de la opción del menu_opcion que se a seleccionado, nomas recupero de la tabla los que tienen como true y los demás no las recupero, esto con el fin de mostrar los elementos seleccionado anteriormente en el jtree cuando fue registrado la ultima vez.
    aki muestro al asignarle por primera vez los privilegios.. al usuario

  • http://sim1.subirimagenes.net/img/2015/06/23//150623102806498692.png
  • como se dan cuenta en la parte de ajustes nomas se selecciona los privilegios de - Ajustes datos responsiva - Actualizar..

    pero cuando se recupera desde la base de datos los privilegios seleccionados, la muestra a si

  • http://sim1.subirimagenes.net/img/2015/06/23//150623102849498693.png
  • la opción -Ajustes de datos inventario - Actualizar estas dos opciones no fueron seleccionados, pero al recuperar y mostrarla la selecciona y no debe ser creo que es por la linea de código

     
    jtreecheck.getCheckingModel().setCheckingMode(CheckingMode.PROPAGATE_PRESERVING_UNCHECK);

    pero seguire checando aver que pasa..

    Imagen de pechsclk

    Cada hoja debería ser un privilegio y los nodos

    Es correcto JPaul los nodos no se deben capturar, estube checando sii, al momento de recuperar la id del nodo de la base de datos,
    son los que hace que se activen los demas ramas o nodos decendites... y si no se captura. pues todo queda bien, solamente se activan los que realmente fue registrado

    Re: todo queda bien

    ¡Ja! Sólo espero que la empresa ya te libere. Bueno, sé que algunas empresas dan un apoyo mensual por prácticas. Ojalá sea tu caso.

    Imagen de pechsclk

    Sólo espero que la empresa ya te libere

    pinzo que es necesario capturar el nodo, nomas que al momento de recuperar los ids de la base de datos los voy a excluir, aunque no es estético.y solo recuperar los ids de las ojas....
    ---------------------------------------------------------------------------------------------------------------------------------------------
    pues nombre aqui solo nos explotan.. nos an dicho que al final nos van a dar una feria,.
    pero pues hasta ahorita nomas nos apoyan con un vale de comida a medio día. de ahi en fuera solo eso..
    pero si he estado batallando, pero ahora solo vengo dos días a la semana....
    --------------------------------------------------------------------------------------------------------------------------------------------------------

    Gracias jpaul. por tus recomendaciones, y pues por ejemplos que me proporcionas, la mera verdad me han servidor..
    de por si aquí creo que voy a seguir posteando mis dudas.. que en ese foro me han resuelto las dudas..