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

Composants Java Discussion :

JTree dynamique


Sujet :

Composants Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 16
    Points : 7
    Points
    7
    Par défaut JTree dynamique
    Bonjour à tous, et merci d'avance pour votre aide....

    Je développe actuellement une application JAVA nécessitant l'emploi d'un JTree pour la sélection de fichiers.
    Les disques durs actuels étant de plus en plus gros, le temps de scanner l'ensemble de l'arborescence prend un temps fou (surtout sur un disque de 500 Go !!!).

    Mon souhait serait de ne scanner un lecteur ou un dossier, uniquement si l'utilisateur le sélectionne et donc ne descendre que d'un niveau à chaque fois.
    Mais si je n'ajoute pas d' "enfants" à un noeud, celui-ci n'est reconnu que comme une "feuille" je ne peux donc pas cliquer dessus pour l'ouvrir, le scanner.....

    Si quelq'un a une idée...

  2. #2
    Membre éclairé Avatar de Pollux
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    706
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2005
    Messages : 706
    Points : 680
    Points
    680
    Par défaut
    Tu peux sortir les sous-éléments... Et pas descendre dans les sous-sous-répertoires.
    Pour chaque langage existe une faq / N'oubliez pas de lire les règles du forum

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    C'est à dire ???

    Qu'est ce que tu entends par sortir ?

  4. #4
    Membre éclairé Avatar de Pollux
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    706
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2005
    Messages : 706
    Points : 680
    Points
    680
    Par défaut
    Par exemple disons que ton disque n'ait qu'un lecteur.

    Tu charges le premier niveau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    File f = new File(lecteur);
    f.list(); //sous-niveau (rép + fichier)
    Tu ajoutes tes noeuds suivant le list().
    Lors d'un clic sur un réperoire tu répètes l'opération avec le répertoire, c'est pas ce que tu veux?
    Pour chaque langage existe une faq / N'oubliez pas de lire les règles du forum

  5. #5
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Utilise un DefaultTreeCellRenderer personnalisé pour ton JTree et des DefaultMutableTreeNode personnalisés.

    Tu fais style un Node pour les dossiers, un pour les fichiers, un pour les disques.
    Et dans ton renderer tu testes l'instance de ton Node style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if (node instanceof DiskTreeNode) {
        setIcon((DiskTreeNode) node.getIcon());
    } else if (node instanceof DirTreeNode) {
        if (selected) {
            setIcon(getDefaultOpenIcon());
        } else {
            setIcon(getDefaultClosedIcon());
        }
    } ...
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Merci pour vos réponses les gars.

    j'crois que j'me suis pas très bien fait comprendre, j'vais esayer d'être plus clair.

    j'dois mettre en place un arbre identique à l'explorateur windows.
    Pour éviter de perdre du temps, je veux scanner uniquement le dossier sélectionner par l'utilisateur.
    Je commence d'abord par récupérer les lecteurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    //récupération des lecteurs
    File[] drive = drive = File.listRoots();
     
    DefaultMutableTreeNode root = new DefaultMutableTreeNode("Poste de Travail", true);
     
     for (int i = 0; i < drive.length; i++) {
    //Pour chaque lecteur, on cré un noeud, qu'on ajoute à la racine
    DefaultMutableTreeNode node = new DefaultMutableTreeNode(drive[i], true);
     
    //ajout à la racine
     root.add(node);
    }
    Ce bout de code me permet uniquement d'afficher un arbre avec une racine "Poste de Travail" et les lecteurs présents sur la machine.

    Mais chaque lecteur est représenté comme une "feuille".

    Sans scanner plus les différents disques, je veux que les répertoires s'affichent comme tel et autorisent la sélection.

    Comme ça après, je récupère un "TreeExpansionEvent" et je lance le scan pour le répertoire en question.

    C'est là que je cherches toujours !!!

    En espérant que j'ai été plus clair.............

  7. #7
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    J'ai donc bien répondu à ta question. Renseigne toi sur les TreeCellRenderer, tu peux choisir l'icône qui s'affiche, et sur les DefaultMutableTreeNode, tu peux dire que c'est un noeud qui autorise les enfants ou pas.

    Y a aussi la solution du noeud temporaire.
    Genre tu met un enfant temporaire à tes noeuds de disques et de fichiers et quand tu veux ouvrir, tu vires le noeud temporaire et tu met les vrais données.
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    J'avais pensé à un noeud temporaire, c'est ce que j'essaye de coder en ce moment.......

    Mais ça signifie récupérer le noeud et faire un remove sur son contenu........

    L'ajout ensuite est simple..........

    J'vais voir si le remove est faisable facilement........

    J'vous tiens au courant...........

    Merci bien !

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    En précision, les DefaultmutableTreeNode peuvent effectivement à la construction être déclaré comme pouvant "accueillir" des enfants ou non, mais si tu n'en ajoutes pas, ce noeud est considéré et affiché comme une feuille..........

    Si tu lui ajoutes un enfant, alors seulement il prendra l'aspect d'un répertoire.........

  10. #10
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Citation Envoyé par sanbiagese
    [...]
    Si tu lui ajoutes un enfant, alors seulement il prendra l'aspect d'un répertoire.........
    Oui, mais bon, moi j'utilise toujours un renderer donc c'est moi qui choisit les icones, pas le programme.
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Désolé de pas avoir donné de news plus tôt.......

    Donc, j'ai réussi à faire ce que je voulais sur mon arbre, à l'aide d'un noeud temporaire que je remove ensuite........

    Voici le code si ça peut aider quelqu'un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    //quand un noeud est oouvert
    	public void treeExpanded (TreeExpansionEvent e) {
     
        		//récupération du noeud sélectionné,
        		DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) e.getPath().getLastPathComponent();
     
    		//appel à la fonction getNodes afin d'obtenir le listing du noeud à afficher
        		getNodes(e.getPath().getLastPathComponent(), parentNode);
     
        		//on efface le noeur temporaire créé précédemment, qui était en position 0
        		parentNode.remove(0);
     
    		//on met à jour le noeud en question (model = le DefaultTreeModel de mon arbre)
        		model.reload(parentNode);
      	}
     
    .
    .
    .
    //A partir d'un noeud donné, on ajoute à celui ci, l'ensemble des fichiers correspondant 
    public void getNodes(Object path, DefaultMutableTreeNode node) {
     
        //on créé une variable File à partir du path donné afin de pouvoir récupérer les fichiers correspondant 
        File nodeToFile = new File(path.toString());
        File[] files = nodeToFile.listFiles();
     
        if (files != null) {
          for (int i = 0; i < files.length; i++) {
            //je ne souhaitais pas afficher les fichiers cachés
            if (!files[i].isHidden()) {
     
    	    //on créé un noeud à partir de files[i]
              DefaultMutableTreeNode node_tmp = new DefaultMutableTreeNode(files[i], true);
     
    	    //si files[i] est un répertoire, je mets unnoeud temporaire
              if (files[i].isDirectory()) {
                DefaultMutableTreeNode temporaryNode = new DefaultMutableTreeNode("tmp");
                node_tmp.add(temporaryNode);
              }
     
    	    //enfin, on ajoute tout ça au noeud parent
              node.add(node_tmp);
            }
          }
        }
      }
    Voilà, merci à vous qui m'avez aidé........
    Maintenant j'ai un autre petit problème sur mon arbre, mais c'est l'objet d'un autre post.....

  12. #12
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Citation Envoyé par apparte
    Localisation: VILLEJUIF
    Loisirs : Manga !!!!!!!

    => Epitéen ?
    Sinon j'me pose une question sur ton arbre... qu'est-ce qui se passe si tu as un dossier que tu ouvres une fois puis que tu le refermes, puis que tu le réouvre. Ca marche correctement ou ça marche pas ? J'ai un doute en lisant ce que tu as posté.
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    OUPS !!!!!!!!!!

    En effet, j'ai oublié de le préciser.........en fait, si on rouvre un noeud fermé, on ajoute 2 fois les fichiers, donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    //à la fermeture d'un noeud
    public void treeCollapsed (TreeExpansionEvent e) {
     
        //on récupère le neud fermé
        DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) e.getPath().getLastPathComponent();
     
        //on enlève tous les enfants du noeud
        parentNode.removeAllChildren();
     
        //et on remet un noeud temporaire
        DefaultMutableTreeNode tmp = new DefaultMutableTreeNode("tmp");
        parentNode.add(tmp);
     
        //update
        windows_Model.reload(parentNode);
      }
    Pardon pour cet oubli.......;

    Du coup, ça fait un peu bricolage je trouve, mais ça fonctionnes et c'est moins couteux qu'un appel récursif pour scanner l'ensemble des disques.....

    Voilà !!!

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Et sinon, non, je ne suis pas de l'Epita, si épitéen signifie bien un membre de cette école..........

    Mais j'en habite pas loin..........

    @+

  15. #15
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    C'est bien ce que je me disais, il manquait quelque chose pour que ça marche.

    Moi je te propose ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    public class TemporaryTreeNode extends DefaultMutableTreeNode {
        public TemporaryTreeNode() {
            super("...");
        }
    }
     
    //A partir d'un noeud donné, on ajoute à celui ci, l'ensemble des fichiers correspondant
    public void getNodes(Object path, DefaultMutableTreeNode node) {
     
        // test si noeud temporaire
        if (node.getChildCount() != 1 || !(node.getFirstChild() instanceof TemporaryTreeNode)) {
            return;
        }
     
        //on créé une variable File à partir du path donné afin de pouvoir récupérer les fichiers correspondant
        File nodeToFile = new File(path.toString());
        File[] files = nodeToFile.listFiles();
     
        if (files != null) {
          for (int i = 0; i < files.length; i++) {
            //je ne souhaitais pas afficher les fichiers cachés
            if (!files[i].isHidden()) {
     
           //on créé un noeud à partir de files[i]
              DefaultMutableTreeNode node_tmp = new DefaultMutableTreeNode(files[i], true);
     
           //si files[i] est un répertoire, je mets unnoeud temporaire
              if (files[i].isDirectory()) {
                TemporaryTreeNode temporaryNode = new TemporaryTreeNode();
                node_tmp.add(temporaryNode);
              }
     
           //enfin, on ajoute tout ça au noeud parent
              node.add(node_tmp);
     
               // et on supprime le noeuf temporaire
               node.remove(0);
            }
          }
        }
     
    //quand un noeud est ouvert
       public void treeExpanded (TreeExpansionEvent e) {
     
              //récupération du noeud sélectionné,
              DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) e.getPath().getLastPathComponent();
     
          //appel à la fonction getNodes afin d'obtenir le listing du noeud à afficher
              getNodes(e.getPath().getLastPathComponent(), parentNode);
     
          //on met à jour le noeud en question (model = le DefaultTreeModel de mon arbre)
              model.reload(parentNode);
         }
    Code non testé mais devrait marcher.

    Comme ça, tu ne recharges pas un noeud qui a déjà les données correctes mais seulement ceux qui ont un enfant temporaire. Plus besoin du treeCollapsed non plus.
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

  16. #16
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Citation Envoyé par sanbiagese
    Et sinon, non, je ne suis pas de l'Epita, si épitéen signifie bien un membre de cette école..........
    Ok oui un épitéen est un membre de Epita.
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

  17. #17
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    J'ai testé ton code et bonne nouvelle .............

    It Works !!!!!!!!!!!!!!!

    C'est un peu moins couteux pour le programme, donc je vais garder cette version......

    C'était trsè ingénieux, merci pour tes précisions........

    Sinon, j'ai posté un sujet sur le filtrage du jtree (puisque j'en ai besoin...), alors si t'as une idée...........elle est la bienvenue !!!!!!!

  18. #18
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Merci, content que ça marche.
    J'ai vu l'autre sujet, mais je sais faire filtrage pour JTable, jamais fait de filtrage pour JTree encore.
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

  19. #19
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    OK.........


    Alàlà..........ça va me prendre la tête ça encore !!!!!!!!!!!!!!!!

    Merci pour tout.....

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

Discussions similaires

  1. Ajout de Noeud dans un JTree dynamique
    Par Dia972 dans le forum Composants
    Réponses: 4
    Dernier message: 18/02/2015, 15h59
  2. déployer JTree dynamiquement
    Par boboss123 dans le forum Composants
    Réponses: 1
    Dernier message: 31/05/2010, 10h41
  3. JTree dynamique: edition
    Par L1011 dans le forum Composants
    Réponses: 1
    Dernier message: 19/02/2009, 12h25
  4. JTree dynamique & rafraichissement
    Par rod59 dans le forum Composants
    Réponses: 5
    Dernier message: 08/05/2006, 15h22
  5. [JTree] Construction dynamique
    Par raj dans le forum Composants
    Réponses: 7
    Dernier message: 09/12/2004, 17h03

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