Creare l'albero delle cartelle in Java

Creato il 31 maggio 2012 da Ketek @CarloVentrella

Per creare un albero di cartelle in Java è necessario importare la classe jTree e defaultMutableTreeNode: la prima corrisponde all´albero in sè, la seconda corrisponde ai nodi dell´albero, quindi ai file e alle cartelle.

Vediamo come realizzarlo.

Java

 
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.File;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
 
/**
 *
 * @author CARLO
 */
public class Tree {
 
 DefaultMutableTreeNode top;
 JTree jTree1;
 DefaultMutableTreeNode dmtnParent;
 
 public Tree()
 {
 
    File root;
    JFrame frame = new JFrame("FileTreeDemo");
    JScrollPane scrollpane = new JScrollPane();
    frame.getContentPane().add(scrollpane, "Center");
    frame.setSize(400,400);
    frame.setVisible(true);
    File f = new File("C:\");
    makeTree(f,scrollpane);
 
    // gestisco chiusura della finestra
    frame.addWindowListener(new WindowListener(){
            public void windowOpened(WindowEvent e) {
                throw new UnsupportedOperationException("Not supported yet.");
            }
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
            public void windowClosed(WindowEvent e) {
                throw new UnsupportedOperationException("Not supported yet.");
            }
            public void windowIconified(WindowEvent e) {
                throw new UnsupportedOperationException("Not supported yet.");
            }
 
            public void windowDeiconified(WindowEvent e) {
                throw new UnsupportedOperationException("Not supported yet.");
            }
 
            public void windowActivated(WindowEvent e) {
                throw new UnsupportedOperationException("Not supported yet.");
            }
 
            public void windowDeactivated(WindowEvent e) {
                throw new UnsupportedOperationException("Not supported yet.");
            }
    });
 }
 public void makeTree(File f,JScrollPane jScrollPane1){
     top = new DefaultMutableTreeNode(f);
     jTree1 = new JTree(top);
     jScrollPane1.setViewportView(jTree1);
     jTree1.addTreeSelectionListener(new TreeSelectionListener(){
 
     @Override
     public void valueChanged(TreeSelectionEvent arg0) {
 
        // estraggo il nome del file cliccato e creo il file
        dmtnParent = (DefaultMutableTreeNode) jTree1.getLastSelectedPathComponent();
        File f = new File(dmtnParent.toString());
        // genero la lista degli elementi contenuti nella cartella
        // questo può essere un file e non creare nessuna lista (L´eccezione è gestita dopo)
        addChildrens(f.listFiles());
     }
   });
}
public void addChildrens(File [] childrens){
             int i;
             try {
             for (i = 0; i < childrens.length; i++) {
               dmtnParent.add(new DefaultMutableTreeNode(childrens[i])); // Aggiungo il file o la cartella al Tree
             }
             } catch (java.lang.NullPointerException npe) {
                 System.out.println("impossibile accedere - Potrebbe essere un File"); // ecco l´eccezione
             }
}
 public static void main(String [] Args)
 {
   new Tree();
 }
}
 

SPIEGAZIONE

Innanzitutto realizziamo il lato grafico del programma, costituito dal frame principale e da un JScrollPane che conterrà l´albero.

Ora  creiamo l´albero attraverso la funzione makeTree: è una funzione che si occupa di creare il nodo della cartella/file che gli passiamo come argomento. Nel primo caso questo corrisponderà ovviamente alla radice del nostro pc, quindi al disco rigido che solitamente è il C.

A questo punto il programma rimane fermo fino al click su un nodo: nel momento in cui questo è cliccato viene trasformato in un oggetto File e viene creata la lista dei file contenuti nel nodo. E´ ovvio che se il nodo è un file allora l´oggetto lista sarà null. La lista passa ora alla funzione addChildrens() che aggiungerà all´albero tanti nodi quanti sono i file/cartelle contenuti nella lista.