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 :

Problème ouverture/fermeture noeud JTree


Sujet :

Composants Java

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 27
    Points : 18
    Points
    18
    Par défaut Problème ouverture/fermeture noeud JTree
    Bonjour ,

    J'ai un problème à vous soumettre.

    Je réalise actuellement un projet en Java.
    Je dois développer une applet avec interface swing comprenant un Jtree, et d'autres partie.
    J'ai déjà réussi à développer le tree, celui ci fonctionne correctement.
    Le gros de l'interface est aussi préparé.

    Par contre voila mon problème. Dans un soucis d'ergonomie, je voudrais bien permettre à mes utilisateurs de réaliser un expand all sur les répertoires dans l'arborescence du JTree.

    J'ai donc regardé les exemples présent sur le site et j'ai réussi à réaliser qqch de presque fonctionnel. Malheureusement il y a des cas ou cela bug.
    Lorsque je réalise un expand all sur un dossier ne contenant que des feuilles, celui-ci ne se réalise pas. C'est vrai que c'est peut-etre inutile à ce niveau, mais cela m'étonne quand même. Voici la partie du code qui gère l'expand all

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     //fonction permettant de réaliser l'expand all
      public void ouvrirTout(DefaultMutableTreeNode noeud) {
    	    if (noeud == null) return;
    	    for(int i=0; i<noeud.getChildCount(); i++) {
    	      ouvrirTout((DefaultMutableTreeNode) noeud.getChildAt(i));
    	      tree.expandPath(new TreePath(((DefaultMutableTreeNode) noeud.getChildAt(i)).getPath()));
    	    }
    	  }
    Et voici l'endroit ou j'appelle la fonction dans mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    action = new AbstractAction()
        {
        	public void actionPerformed(ActionEvent e) 
        	{
    			DefaultMutableTreeNode noeud = (DefaultMutableTreeNode) clickedPath.getLastPathComponent();
        		if (clickedPath==null)return;
        		if (tree.isExpanded(clickedPath))fermerTout(noeud);	
        		else ouvrirTout(noeud);
        	}
        };
    Je suis nouveau dans l'immense monde du java donc soyez indulgent si l'erreur est monumentale (pas taper )
    L'intégration du popup menu sur clic droit de l'utilisateur fonctionne sans problème.
    A l'inverse, ma fonction permettant de faire le collapse all ferme correctement les différents chemin, sauf les enfants direct au répertoire ou j'effectue le collpase.

    Voici le code du collapse (qui est appelé juste dans le code ci dessus)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //fonction permettant de réaliser le collapse all
      public void fermerTout(DefaultMutableTreeNode noeud) {
    	    if (noeud == null) return;
    	    for(int i=0; i<noeud.getChildCount(); i++) {
    	      fermerTout((DefaultMutableTreeNode) noeud.getChildAt(i));
    	      tree.collapsePath(new TreePath(((DefaultMutableTreeNode) noeud.getChildAt(i)).getPath()));
    	    }
    	  }
    Si vous avez une idée......
    N'hésitez pas si il vous est nécessaire d'avoir une autre partie de mon code d'en faire la demande ^^

    Je vous remercie d'avance.

    Petit plus : Je pense à autre chose, comment pourrais-je réussir qu'au chargement de l'applet, le noeud root soit directement expand d'un cran ??
    Merci

  2. #2
    Futur Membre du Club
    Inscrit en
    Août 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Salut,

    J'ai un peu de mal a comprendre pourquoi est ce que tu crées de nouveau TreePath a chaque fois.
    Ton arbre est deja crée ... il te faut juste les recupérer, pas besoin de créer de nouveau objet !?

    Ci-joint la fonction que j'utilise dans mes codes et qui marche bien

    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
     
     private JPopupMenu createPopupMenu() {
        	JPopupMenu popup = new JPopupMenu();
        	JMenuItem menuItemExpand, menuItemCollapse;
        	/*ExpandAll*/
        	menuItemExpand = new JMenuItem("Expand All");
        	menuItemExpand.addActionListener(new ActionListener() {
        		public void actionPerformed(ActionEvent e) {
        			for (int j=1; j<arbre.getRowCount();j++){
        				TreePath myPath = arbre.getPathForRow(j);
        				if (arbre.isCollapsed(myPath) == true){
        					arbre.expandPath(myPath);
        				}
        			}
        		}
        	});
        	popup.add(menuItemExpand);
        	/*CollapseAll*/	
        	menuItemCollapse = new JMenuItem("Collapse All");
        	menuItemCollapse.addActionListener(new ActionListener() {
        		public void actionPerformed(ActionEvent e) {
        			for (int j=1; j<arbre.getRowCount();j++){
        				TreePath myPath = arbre.getPathForRow(j);
        				if (arbre.isExpanded(myPath) == true){
        					arbre.collapsePath(myPath);
        				}
        			}
        		}
    	    });
        	popup.add(menuItemCollapse);
        	popup.setBorder(new BevelBorder(BevelBorder.RAISED));
        	return popup;
        }
    En esperant que ca t'aide ..

  3. #3
    Membre confirmé Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Points : 554
    Points
    554
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tree.expandPath(new TreePath(((DefaultMutableTreeNode) noeud.getChildAt(i)).getPath()));
    Il me semble que le .getPath() renvoie le chemin permettant d'accéder au noeud...

    essaie un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tree.expandPath(new TreePath(((DefaultMutableTreeNode) noeud.getChildAt(i)).getPath(), noeud.getChildAt(i)));
    mais je ne suis pas sûr...

  4. #4
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 27
    Points : 18
    Points
    18
    Par défaut
    Merci merci ^^ , je test tout ca et je vous tien au courant, en espérant pouvoir cliquer sur le petit bouton "résolu"

    Edit : Bon voilà jai testé avec vos propositions.

    @ Claythest : expand all ne prend pas en charge les type treeNode (renvoyé dans ton exemple par ce que tu rajoutais) , donc pas de ce coté qu'il faut y trouver une solution.

    @snico : concernant mes divers treepath, c'est une erreur de ma part (je suis tout nouveau en java, j'en suis encore au stade de prendre des code par ci par la et les adapter à mes applications en essayant d'en comprendre le fonctionnement.) J'ai donc essayé de prendre dans ta fonction les parties nécessaires à mon expand all et collapse all.
    Malheureusement un problème survient, pas un plantage c'est deja ca
    Je ne peux réaliser d'expand all sur le dossier root, en soi pas un problème(a vrai dire c'est même ainsi que ca devrait tourner idéalement),par contre, l'expand all...ben il ouvre vraiment tout... Peut-etre est ce normal avec ton code, c'est pour ca que j'aurais besoin de ton avis
    Ce que je voudrais c'est ouvrir l'entierté du répertoire et ses sous répertoires
    au départ du répertoire ou je clic.

    Merci beaucoup en tout cas

Discussions similaires

  1. Problème ouverture fermeture Form
    Par Allspark dans le forum C#
    Réponses: 6
    Dernier message: 26/08/2010, 13h57
  2. probleme d'ouverture fermeture noeud c#/xpath
    Par batgrat dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 11/12/2008, 16h29
  3. problème avec les noeuds d'une JTree
    Par soujava dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 12/06/2008, 16h42
  4. Réponses: 11
    Dernier message: 10/07/2007, 21h31
  5. Problème de fermeture de balise <tr>
    Par nuage dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 18/03/2004, 10h55

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