Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1

    [Java] JTree e percorso directory

    questo è il jframe:
    codice:
    public class Main extends javax.swing.JFrame {
    
        private DefaultMutableTreeNode master = new DefaultMutableTreeNode();
    
        ......
    
        private void itemChooseActionPerformed(java.awt.event.ActionEvent evt) {                                           
            JFileChooser fc = null;
            StringBuilder lista = null;
            File dir = null;
            if (fc == null) {
                fc = new JFileChooser();
                fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
                int stato = fc.showOpenDialog(fc);
                if (stato == JFileChooser.APPROVE_OPTION) {
                    dir = fc.getSelectedFile();
                    try {
                        lista = ListDir.sortList(dir);
                    } catch (FileNotFoundException ex) {
                        JOptionPane.showMessageDialog(null, ex.getMessage());
                    }
                }
            }
            listAllFiles(dir.getPath(), master, rootPaneCheckingEnabled);
            areaFile.setText(lista.toString());
        }                                          
    
        public static void listAllFiles(String directory, DefaultMutableTreeNode parent, Boolean recursive) {
            File[] children = new File(directory).listFiles();
            Arrays.sort(children, new myComparator());
            for (int i = 0; i < children.length; i++) {
                DefaultMutableTreeNode node = new DefaultMutableTreeNode(children[i].getName());
                if (children[i].isDirectory() && recursive) {
                    parent.add(node);
                    listAllFiles(children[i].getPath(), node, recursive);
                } else if (!children[i].isDirectory()) {
                    parent.add(node);
                }
            }
        }
    ......
    così scansiono una directory e modello il jtree e stampo su una text area tutto il contenuto richiamando ListDir.sortList(dir);
    codice:
    public class ListDir {
    
        private static void listingDir(File dir, int livello, StringBuilder sb) {
            String spazio = "";
            File[] elementi = dir.listFiles();
            for (int l = 0; l < livello; l++) {
                spazio += "  |_";
            }
            Arrays.sort(elementi, new myComparator());
            for (File files : elementi) {
                sb.append(spazio).append(files.getName()).append("\n");
                if (files.isDirectory()) {
                    listingDir(files, livello + 1, sb);
                }
            }
        }
    
        public static StringBuilder sortList(File dir) throws FileNotFoundException {
            validateDir(dir);
            StringBuilder sb = new StringBuilder();
            listingDir(dir, 0, sb);
            return sb;
        }
    
        private static void validateDir(File dir) throws FileNotFoundException {
            if (dir == null) {
                throw new IllegalArgumentException("Directory should not be null.");
            }
            if (!dir.exists()) {
                throw new FileNotFoundException("Directory does not exist: " + dir);
            }
            if (!dir.isDirectory()) {
                throw new IllegalArgumentException("Is not a directory: " + dir);
            }
            if (!dir.canRead()) {
                throw new IllegalArgumentException("Directory cannot be read: " + dir);
            }
        }
    }
    vorrei però fare in modo che quando clicco su un nodo nella textarea venga stampato il contenuto di quella directory.
    1-che evento mi conviene usare sul jtree?
    2-come faccio a recuperare il percorso del nodo scelto??

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328

    Re: [Java] JTree e percorso directory

    Originariamente inviato da fermat
    1-che evento mi conviene usare sul jtree?
    Devi aggiungere un TreeSelectionListener al JTree, usando l'apposito metodo addTreeSelectionListener()

    2-come faccio a recuperare il percorso del nodo scelto??
    Lo fai attraverso il TreeSelectionListener. Nel tutorial How to Use Trees è scritto tutto.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    avevo provato:
    codice:
        private void treeFileValueChanged(javax.swing.event.TreeSelectionEvent evt) {                                      
            DefaultMutableTreeNode node = (DefaultMutableTreeNode) treeFile.getLastSelectedPathComponent();
            if (node == null) {
                return;
            }
            Object nodeInfo = node.getUserObject();
            if (node.isLeaf()) {
                try {
                    StringBuilder sb = ListDir.sortList((File) nodeInfo);
                    areaFile.setText(sb.toString());
                } catch (FileNotFoundException ex) {
                    JOptionPane.showMessageDialog(null, ex.getMessage());
                }
            }
        }
    nn succede nulla, neanche un errore.
    pensavo sbagliassi approccio.

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    codice:
    private void treeFileValueChanged(javax.swing.event.TreeSelectionEvent evt)
    ?

    L'interfaccia TreeSelectionListener prevede il metodo valueChanged(TreeSelectionEvent).

    Quindi: stai implementando correttamente l'interfaccia? Stai assegnando al JTree un oggetto corretto? O stai usando la cosa più orrenda che l'uomo abbia mai inventato, ovvero l'autocompletamento del codice da parte di un IDE di tipo RAD?


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    concordo con te che è brutto, però mi hanno sempre funzionato.
    cmq:
    codice:
    treeFile.addTreeSelectionListener(new SelectListner());
    ......
        private class SelectListner implements TreeSelectionListener {
    
            public void valueChanged(TreeSelectionEvent e) {
                DefaultMutableTreeNode node = (DefaultMutableTreeNode) treeFile.getLastSelectedPathComponent();
                if (node == null) {
                    return;
                }
                Object nodeInfo = node.getUserObject();
                if (node.isLeaf()) {
                    try {
                        StringBuilder sb = ListDir.sortList((File) nodeInfo);
                        areaFile.setText(sb.toString());
                    } catch (FileNotFoundException ex) {
                        JOptionPane.showMessageDialog(null, ex.getMessage());
                    }
                }
            }
        }
    stesso comportamento.

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    A me questo esempio che ho fatto al volo funziona perfettamente:

    codice:
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    import javax.swing.tree.*;
    import javax.swing.event.*;
    
    public class MioTree extends JFrame implements TreeSelectionListener {
    
       private JTree mioTree;
       private JSplitPane split;
       private JTextArea txt;
    
       public MioTree() {
    
          Container c = getContentPane();
          c.setLayout( new BorderLayout() );
    
          mioTree = new JTree( creaAlbero() );
          mioTree.addTreeSelectionListener( this );
    
          JScrollPane jsp = new JScrollPane( mioTree );
          txt = new JTextArea();
    
          split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, jsp, txt);
    
          c.add(split, BorderLayout.CENTER);
    
          setSize(800, 600);
          setTitle("Prova JTree");
          setDefaultCloseOperation( EXIT_ON_CLOSE );
          setLocationRelativeTo( null );
          setVisible( true );
       }
    
       private DefaultMutableTreeNode creaAlbero() {
          DefaultMutableTreeNode top = new DefaultMutableTreeNode("Radice");
    
        DefaultMutableTreeNode category = null;
        DefaultMutableTreeNode book = null;
        
        category = new DefaultMutableTreeNode("Books for Java Programmers");
        top.add(category);
        
        //original Tutorial
        book = new DefaultMutableTreeNode("Primo Libro");
        category.add(book);
        
        //Tutorial Continued
        book = new DefaultMutableTreeNode("Secondo Libro");
        category.add(book);
        
        //JFC Swing Tutorial
        book = new DefaultMutableTreeNode("Terzo Libro");
        category.add(book);
    
        category = new DefaultMutableTreeNode("Books for Java Implementers");
        top.add(category);
    
        //VM
        book = new DefaultMutableTreeNode("VM - Libro 1");
        category.add(book);
    
        //Language Spec
        book = new DefaultMutableTreeNode("VM - Libro 2");
        category.add(book);
    
        return top;
       }
       
       public void valueChanged(TreeSelectionEvent tse) {
          DefaultMutableTreeNode node = (DefaultMutableTreeNode) mioTree.getLastSelectedPathComponent();
    
          if (node == null) return;   // Nessuna selezione
    
          Object nodeInfo = node.getUserObject();
          if ( node.isLeaf() ) {
             String book = (String) nodeInfo;
             txt.append ( book + "\n");
          } else {
             txt.append("E' stato selezionato un nodo non foglia.\n");
          }
       }
    
       public static void main(String[] args) {
          MioTree mt = new MioTree();
       }
    }

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    forse il problema nn è nel listener allora.
    i tuoi nodi li aggiungi a mano mentre io così:
    codice:
        public static void listAllFiles(String directory, DefaultMutableTreeNode parent, Boolean recursive) {
            File[] children = new File(directory).listFiles();
            Arrays.sort(children, new myComparator());
            for (int i = 0; i < children.length; i++) {
                DefaultMutableTreeNode node = new DefaultMutableTreeNode(children[i].getName());
                if (children[i].isDirectory() && recursive) {
                    parent.add(node);
                    listAllFiles(children[i].getPath(), node, recursive);
                } else if (!children[i].isDirectory()) {
                    parent.add(node);
                }
            }
        }
    la directory iniziale è ripresa da un file chooser.

    ad ogni click richiamo questo metodo:
    codice:
    public class ListDir {
    
    ...........
    
        public static StringBuilder sortList(File dir) throws FileNotFoundException {
            validateDir(dir);
            StringBuilder sb = new StringBuilder();
            listingDir(dir, 0, sb);
            return sb;
        }
    
    ......
    
    }
    che richiede un File (che in pratica è la directory da listare).
    il problema è sicuramente qua:
    codice:
                if (node.isLeaf()) {
                    try {
                        StringBuilder sb = ListDir.sortList((File) nodeInfo);
                        areaFile.setText(sb.toString());
                    } catch (FileNotFoundException ex) {
                        JOptionPane.showMessageDialog(null, ex.getMessage());
                    }
                }
    cioè il nodo mi deve rappresentare un file da passare a quel metodo.
    probabilmente è qui che toppo.
    come faccio a fare in modo che il nodo rappresenti la directory selezionata??

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    codice:
    DefaultMutableTreeNode node = new DefaultMutableTreeNode(children[i].getName());
    Il nodo NON rappresenta un oggetto File, ma un oggetto String (il nome del file).

    Per ottenere quello che chiedi dovrai costruire una classe apposita che rappresenta il nodo e che fornisca una rappresentazione stringa dello stesso. Ad esempio:

    codice:
    public class MioNodo {
       private File f;
       public MioNodo(File f) {
          this.f = f;
       }
    
       public File getFile() { return f; }
       public String toString() { return f.getName(); }
    }
    Quindi modificherai il tuo codice così:

    codice:
    DefaultMutableTreeNode node = new DefaultMutableTreeNode( new MioNodo(children[i]) );
    Il tuo nodo, ora, è un oggetto MioNodo ed il listener può usarlo:

    codice:
                MioNodo nodeInfo = (MioNodo) node.getUserObject();
                if (node.isLeaf()) {
                    try {
                        StringBuilder sb = ListDir.sortList(nodeInfo.getFile());
                        areaFile.setText(sb.toString());
                    } catch (FileNotFoundException ex) {
                        JOptionPane.showMessageDialog(null, ex.getMessage());
                    }
                }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    ho seguito le tue ottime indicazioni, e ho passato buona parte della serata a cercare di mettere a posto un problema, ma senza successo.
    codice:
    public class NodeFile {
    
        private File f;
    
        public NodeFile(File f) {
            this.f = f;
        }
    
        public File getFile() {
            return f;
        }
    
        @Override
        public String toString() {
            return f.getName();
        }
    }
    codice:
        public static void listAllFiles(String directory, DefaultMutableTreeNode parent, Boolean recursive) {
            File[] children = new File(directory).listFiles();
            Arrays.sort(children, new myComparator());
            for (int i = 0; i < children.length; i++) {
                DefaultMutableTreeNode node = new DefaultMutableTreeNode(new NodeFile(children[i]));
                if (children[i].isDirectory() && recursive) {
                    parent.add(node);
                    listAllFiles(children[i].getPath(), node, recursive);
                } else if (!children[i].isDirectory()) {
                    parent.add(node);
                }
            }
        }
    codice:
        private class SelectListner implements TreeSelectionListener {
    
            public void valueChanged(TreeSelectionEvent e) {
                DefaultMutableTreeNode node = (DefaultMutableTreeNode) treeFile.getLastSelectedPathComponent();
                if (node == null) {
                    return;
                }
                NodeFile nodeInfo = (NodeFile) node.getUserObject();
                if (node.isLeaf()) {
                    try {
                        StringBuilder sb = ListDir.sortList(nodeInfo.getFile());
                        areaFile.setText(sb.toString());
                    } catch (FileNotFoundException ex) {
                        JOptionPane.showMessageDialog(null, ex.getMessage());
                    }
                }
            }
        }
    al scatenarsi dell'evento mi compare questa eccezione di cast:
    codice:
    Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String cannot be cast to listdir.NodeFile
            at listdir.Main$SelectListner.valueChanged(Main.java:142)
    ............
    la riga è questa:
    NodeFile nodeInfo = (NodeFile) node.getUserObject();

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Domanda: quell'eccezione si scatena quando selezioni la radice? Perchè dal codice, non si capisce come costruisci il nodo radice del JTree.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.