IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

JTree, les dossiers vides apparaissent comme un fichier


Sujet :

Langage Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 259
    Points : 97
    Points
    97
    Par défaut JTree, les dossiers vides apparaissent comme un fichier
    Bonjour,

    Je liste un répertoire FTP et l'affiche dans un JTree, avec des defaultMutableTreeNode.
    Par défaut, le JTree affecte aux noeuds feuille l'icône de fichier et aux autres l'icône d'un dossier.

    Mon problème est que dans ce répertoire, des dossiers sont vides et donc le noeud n'a pas d'enfant. Le dossier est donc représenté sous forme de fichier.
    Comment représenter les dossiers vides avec une icône de dossier ?

    Les seules propriétés que j'ai trouvé sont au niveau de la classe DefaultTreeCellRenderer avec les méthodes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DefaultTreeCellRenderer renderer3 = new DefaultTreeCellRenderer();
        renderer3.setOpenIcon(customOpenIcon);
        renderer3.setClosedIcon(customClosedIcon);
        renderer3.setLeafIcon(customLeafIcon);
        tree3.setCellRenderer(renderer3);
    source : http://www.apl.jhu.edu/~hall/java/Sw...ial-JTree.html

    Mais renderer3 est associé directement au JTree et non pas au DefaultMutableTreeNode.

    Y a-t-il une solution pour personnaliser correctement mon JTree ?

    Merci d'avance.

  2. #2
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    Tu peus créer une classe qui hérite de DefaultMutableTreeNode que tu associe à ton fichier et qui réécris la méthode isLeaf() afin de renvoyé false s'il s'agit d'un repertoire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class FileNode extends DefaultMutableTreeNode {
     
         private File file;  // fichier associé
     
         /* ... */
     
        public boolean isLeaf() {
             return !file.isDirectory();
        }
    }
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 259
    Points : 97
    Points
    97
    Par défaut
    Merci le y@m's, comme d'habitude !
    Je vais voir comment adapter ton exemple.

    A bientôt !

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 259
    Points : 97
    Points
    97
    Par défaut
    J'ai un peu de mal à voir comment m'y prendre. Pourrais-tu me dire si je vais dans la bonne direction ?

    Je ne peux pas utiliser de membre File dans la classé étendue car ma classe qui gère la connexion FTP ne me retourne que des string.
    Mais à l'instanciation de la classe FileNode (extention de DefaultMutableTreeNode) je sais déjà s'il s'agit d'un répertoire ou non. Ainsi, j'utilise un booléen.

    Voici ce que j'ai commencé à faire mais en vain :
    import java.io.*;
    import javax.swing.JTree;
    import javax.swing.tree.*;

    public class FileNode extends DefaultMutableTreeNode {

    private DefaultMutableTreeNode _node;
    private boolean _isFolder;
    private String _name;

    FileNode(String name, boolean isFolder){
    _isFolder = isFolder;
    _name = name;
    _node = new DefaultMutableTreeNode(_name);
    }

    public boolean isLeaf() {
    return _isFolder;
    }

    public FileNode getLastLeaf() {
    return (FileNode)_node.getLastLeaf();
    }
    }
    Je ne pense pas que je gère correctement l'héritage. Peux-tu me donner une piste supplémentaire ?

  5. #5
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    Tu n'as pas besoin d'avoir d'attribut de type DefaultMutableTreeNode étant donné que ta classe FileNode en hérite (on peus dire : une FileNode est une DefaultMutableTreeNode). En fait tu as juste à réécrire la méthode isLeaf() (plus le constructeur et éventuellement des méthode en plus).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     public class FileNode extends DefaultMutableTreeNode {
     
         private boolean _isFolder;
     
         FileNode(String name, boolean isFolder){
             super(name);   // on appelle le constructeur parent (c'est à dire : DefaultMutableTreeNode(name) )
             _isFolder = isFolder;
         }
     
         public boolean isLeaf() {
             return _isFolder;
         }
    }
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 259
    Points : 97
    Points
    97
    Par défaut
    Merci,

    J'y suis enfin arrivé en utilisant ta méthode !

    Mon principal problème a été de récupérer le dernier enfant du FileNode. getLastLeaf() me retourne le bon noeud si je l'applique à un DefaultMutableTreeNode tandis que ce même getLastLeaf() appliqué à un FileNode me dit qu'il n'y a plus d'enfant.

    La solution a été getLastChild().

    Merci pour ton aide.

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Il y a plus simple
    Dans le DefaultTreeModel (modèle de l'arbre JTree accessible par la méthode getModel()), la methode setAsksAllowsChildren(true) permet de tenir compte du type de noeud.
    Pour un noeud de type DefaultMutableTreeNode, utiliser alors la méthode (ou le constructeur adéquat) setAllowsChildren(true). Ainsi, le noeud ajouté en tant que feuille apparaitra en tant que dossier.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // myJTree est mon arbre
    JTree myJtree = new JTree();
     
    DefaultTreeModel treeModel = (DefaultTreeModel) myJTree.getModel();
    // Autoriser les feuilles du modele à s'afficher en tant que folder
    // si getAllowsChildren() == true pour cette feuille
    treeModel.setAsksAllowsChildren(true);
     
    // La feuille a ajouter sera construite ainsi
    DefaultMutableTreeNode leafFolder = new DefaultMutableTreeNode("New Leaf Folder", true);
    // Ou pour transfoormer une feuille fichier en feuille folder
    leafFollder.setAllowsChildren(true);
     
    // L'ajout de cette feuille dans l'arbre apparaitra en tant que folder

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Bonjour à tous !

    Merci pour ces exemples, l'icône de mes dossiers s'affichent bien dans mon explorateur de fichier.

    Maintenant, les nœuds apparaissent eux aussi mais disparaissent lorsque je clique dessus, et mon arborescence n'est pas déplié.
    Mon TreeSelectionListener ( qui génère la suite des répertoires ) prend en compte le clique sur le dossier mais pas celui sur le noeud, j'imagine.

    Comment régler le problème ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Rechercher les dossiers vide
    Par Gregory666 dans le forum Débuter
    Réponses: 6
    Dernier message: 31/05/2013, 16h56
  2. Comment ignorer les dossiers vides ?
    Par budhax dans le forum Langage
    Réponses: 1
    Dernier message: 24/11/2008, 09h08
  3. Réponses: 2
    Dernier message: 04/05/2006, 13h10
  4. Lister les dossiers et fichiers d'un répertoire
    Par scorpia dans le forum ASP
    Réponses: 2
    Dernier message: 11/04/2006, 18h50
  5. Réponses: 2
    Dernier message: 14/03/2006, 17h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo