Foro de elhacker.net

Programación => Java => Mensaje iniciado por: SARGE553413 en 31 Julio 2013, 02:30 am



Título: Problema con árbol de directorios java swing [SOLUCIONADO]
Publicado por: SARGE553413 en 31 Julio 2013, 02:30 am
Hola a todos.

Quiero crear una GUI que muestre el árbol de directorios, y los subdirectorios de estos según se vaya desplegando.

En lugar de crear todo el árbol de golpe (demasiado costoso), lo que quiero es que al darle a desplegar "C:/" por ej., en ese momento se creen los nodos pertinentes y se muestren.

Lo he intentado hacer pero como el nodo raíz (C:/) al inicio está vacío, el método que tengo para caputar el TreeExpansionEvent no hace nada (aparte de que no estoy seguro de que funcione bien). ¿Qué puedo hacer?

Muchas gracias.

PD.adjunto el código:

Código:
public class DirectoryTree implements TreeExpansionListener{
    
    /* Atributos necesarios: */
    DefaultMutableTreeNode root;
    DefaultTreeModel model;
    JTree dirTree;
    
    /* COnstructor: */
    public DirectoryTree(){
        root=new DefaultMutableTreeNode("C:/");
        model=new DefaultTreeModel(root);
        dirTree=new JTree(model);
    }
    
    /* Devuelve el JTree para poder pasarselo a JScrollPane */
    public JTree getTree(){
        return this.dirTree;
    }

    @Override
    public void treeExpanded(TreeExpansionEvent event) {
        TreePath tp=event.getPath();
        Object aux2[]=tp.getPath();
        String aux="";
        for(int i=0;i<aux2.length;i++){
            aux=aux+"/"+((DefaultMutableTreeNode)aux2[i]).toString();
        }
        addFolders(aux,this.model,this.root);
    }

       private static void addFolders(String path,DefaultTreeModel m,DefaultMutableTreeNode root){
        File fil=new File(path);
        if(fil!=null){
            String aux[]=fil.list();
            for(int i=0;i<aux.length;i++){
                m.insertNodeInto(new DefaultMutableTreeNode(aux[i]), root, i);
            }
        }
    }

public static void main(String args[]){
        JFrame frame=new JFrame();
        DirectoryTree dt=new DirectoryTree();
        JScrollPane jsc=new JScrollPane(dt.getTree());
        frame.getContentPane().add(jsc);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }



Título: Re: Problema con árbol de directorios java swing
Publicado por: SARGE553413 en 31 Julio 2013, 17:52 pm
Hola de nuevo. He encontrado la solución a mi problema.

El problema era que al seleccionar una "carpeta vacia" (porque recordemos que aun no se han agregado sus sub-carpetas) no ocurría un evento 'TreeExpansionEvent'.

Pero si que, al seleccionar dicha carpeta "vacía" ocurre un 'TreeSelectionEvent', de tal manera que escribiendo nuestro método dentro de un listener de ese evento, al seleccionar el "archivo (carpeta vacía)", esta pasa a convertirse en una carpeta con todas su subcarpetas asociadas.
Añadiendo un simple if(....!=null){...} conseguimos que al seleccionar archivos (que obviamente no tienen subdirectorios) no se lance una NullPointerException.

Saludos.

PD. Adjunto el código, si alguien detecta algún error agradecería que me lo comentase.

Código:

import java.io.File;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeExpansionEvent;
import javax.swing.event.TreeExpansionListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;

/**
 *
 * @author Dan
 */
public class DirectoryTree implements TreeSelectionListener{
    DefaultMutableTreeNode root;
    DefaultTreeModel model;
    JTree dirTree;
   
    public DirectoryTree(){
        root=new DefaultMutableTreeNode("C:/");
        model=new DefaultTreeModel(root);
        dirTree=new JTree(model);
   
        dirTree.addTreeSelectionListener(this);
    }
   
    public JTree getTree(){
        return this.dirTree;
    }
   
    @Override
    public void valueChanged(TreeSelectionEvent e) {
        TreePath tp=e.getPath();
        Object aux2[]=tp.getPath();
        String aux="";
        for(int i=0;i<aux2.length;i++){
            aux=aux+"/"+((DefaultMutableTreeNode)aux2[i]).toString();
        }
        System.out.println(aux);
        addFolders(aux,this.model,(DefaultMutableTreeNode)tp.getLastPathComponent());
    }
   
    private static void addFolders(String path,DefaultTreeModel m,DefaultMutableTreeNode root){
        File fil=new File(path);
        if(fil!=null){
            String aux[]=fil.list();
            if(aux!=null){
                for(int i=0;i<aux.length;i++){
                    m.insertNodeInto(new DefaultMutableTreeNode(aux[i]), root, i);
                }
            }
        }
    }
   
    private static String[] getDirs(File fil){
        if(fil.exists()){
            return fil.list();
        }else{
            return null;
        }
    }
   
    public static void main(String args[]){
        JFrame frame=new JFrame();
        DirectoryTree dt=new DirectoryTree();
        JScrollPane jsc=new JScrollPane(dt.getTree());
        frame.getContentPane().add(jsc);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
}