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][XML] Node étendant DefaultMutableTreeNode


Sujet :

Composants Java

  1. #1
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut [JTree][XML] Node étendant DefaultMutableTreeNode
    Bonjour,

    J'ai créé un Node personnalisé pour résoudre le probleme de node sans enfant qui s'affiche dans le JTree comme un fichier et non un dossier :

    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
    import javax.swing.tree.DefaultMutableTreeNode;
     
    public class MyNode extends DefaultMutableTreeNode {
     
        private boolean isFolder=true;  // folder or not ?
     
        MyNode(String s,boolean isFolder)
        {
        	super(s);
        	this.isFolder=isFolder;
        }
     
        MyNode(String s)
        {
        	super(s);
        }
     
        public boolean isLeaf() 
        {
             return !isFolder;
        }
    }
    et je veux afficher un fichier XML dans un JTree avec comme propriété :

    • Si le noeud XML a des enfants, alors c'est un dossier
    • Si le noeud n'a pas d'enfants mais qu'il n'a pas de texte entre ses balises (comme <noeud></noeud> ou <noeud/>), alors c'est un dossier
    • si le noeud n'a pas d'enfant mais qu'il a un texte entre ses balises (comme <Noeud>Texte</Noeud>) alors c'est un Fichier


    et voici la classe que j'ai faite pour générer mon arbre :

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    import javax.swing.*;
    import javax.swing.tree.*;
     
    import org.jdom.*;
     
    import java.util.Iterator;
     
    public class XMLTree extends JTree
    {
    	static MyNode root=new MyNode("Base");
     
    	XMLTree(XMLManager xmlm)
    	{
    		//super();
    		super(root);
    		//this.root=root;
    		init(xmlm);	
    	}
     
    	private void init(XMLManager xmlm)
    	{
    		setName("BDD");
    		//setRootVisible(false);
    		processElement(xmlm.getRoot(),root);
    	}
     
    	private void processElement(Element el, MyNode dmtn)
    	{
    		if(el.getChildren().size()==0) // fichier ou dossier sans enfants
    		{
    			if(el.getTextNormalize().equals(""))
    			{
    				//gérer pour mettre un dossier
    				MyNode currentNode = new MyNode(el.getName(),true);
    				dmtn.add(currentNode);
    			}
    			else
    			{
    				String text=""+el.getName()+" : "+el.getTextNormalize();
    				MyNode currentNode = new MyNode(text,false);
    				dmtn.add(currentNode);
    			}
    		}
    		else // dossier avec enfants
    		{
    			MyNode currentNode = new MyNode(el.getName(),true);
    			String text = el.getTextNormalize();
     
    			/*if((text != null) && (!text.equals("")))
    				currentNode.add(new MyNode(text));*/
     
    			//processAttributes(el, currentNode);
     
    			Iterator children = el.getChildren().iterator();
     
    			while(children.hasNext())
    				processElement((Element)children.next(), currentNode);
     
    			dmtn.add(currentNode);	
    		}
    	}	
    }
    Lorsque j'affiche cet arbre, le root est bien affiché comme un dossier, mais impossible de le déplier pour voire ses enfants.

    Le même code en remplacant les MyNode par des DefaultMutableTreeNode fonctionne sauf pour les dossiers vides qui sont affichés comme des fichiers (normal).

    Alors, je me creuse la tête depuis quelques heures maintenant, et je ne trouve vraiment pas où j'ai faux.
    Quelqu'un peut m'aiguiller sur l'erreur que j'ai faite ?

    Merci d'avance

    F.

  2. #2
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Salut,

    La solution m'est venue hier avant de m'endormir, en fait j'ai juste à prendre en compte le cas particulier du dossier vide, c'est tout :

    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
    import javax.swing.tree.DefaultMutableTreeNode;
     
    public class MyNode extends DefaultMutableTreeNode {
     
        private Boolean isFolderAlone=null;  // folder or not ?
     
        MyNode(String s,boolean isFolder)
        {
        	super(s);
        	this.isFolderAlone=new Boolean(isFolder);
        }
     
        MyNode(String s)
        {
        	super(s);
        }
     
        public boolean isLeaf() 
        {
        	if(isFolderAlone==null)
        		return super.isLeaf();
        	return !isFolderAlone.booleanValue();
        }
    }
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    import javax.swing.*;
    import javax.swing.tree.*;
     
    import org.jdom.*;
     
    import java.util.Iterator;
     
    public class XMLTree extends JTree
    {
    	static DefaultMutableTreeNode root=new DefaultMutableTreeNode("Base");
     
    	XMLTree(XMLManager xmlm)
    	{
    		//super();
    		super(root);
     
     
    		//this.root=root;
    		init(xmlm);	
    		System.out.println(root.isLeaf());
    	}
     
    	private void init(XMLManager xmlm)
    	{
    		setName("BDD");
    		//setRootVisible(false);
    		processElement(xmlm.getRoot(),root);
    	}
     
    	private void processElement(Element el, DefaultMutableTreeNode dmtn)
    	{
    		if(el.getChildren().size()==0) // fichier ou dossier sans enfants
    		{
    			if(el.getTextNormalize().equals(""))
    			{
    				//gérer pour mettre un dossier
    				MyNode currentNode = new MyNode(el.getName(),true);
    				dmtn.add(currentNode);
    			}
    			else
    			{
    				String text=""+el.getName()+" : "+el.getTextNormalize();
    				DefaultMutableTreeNode currentNode = new DefaultMutableTreeNode(text);
    				dmtn.add(currentNode);
    			}
    		}
    		else // dossier avec enfants
    		{
    			DefaultMutableTreeNode currentNode = new DefaultMutableTreeNode(el.getName());
    			String text = el.getTextNormalize();
     
    			/*if((text != null) && (!text.equals("")))
    				currentNode.add(new MyNode(text));*/
     
    			//processAttributes(el, currentNode);
     
    			Iterator children = el.getChildren().iterator();
     
    			while(children.hasNext())
    				processElement((Element)children.next(), currentNode);
     
    			dmtn.add(currentNode);	
    		}
    }
     
     
    	/*private void processElement(Element el, DefaultMutableTreeNode dmtn)
    	{
    		 DefaultMutableTreeNode currentNode = new DefaultMutableTreeNode(el.getName());
    		 String text = el.getTextNormalize();
    		 if((text != null) && (!text.equals("")))
    		 	currentNode.add(new DefaultMutableTreeNode(text));
     
    		 processAttributes(el, currentNode);
     
    		 Iterator children = el.getChildren().iterator();
     
    		 while(children.hasNext())
    		 	processElement((Element)children.next(), currentNode);
     
    		 dmtn.add(currentNode);
    	 }*/
     
    	/* private void processAttributes(Element el, DefaultMutableTreeNode dmtn) 
    	 {
    		 Iterator atts = el.getAttributes().iterator();
     
    		 while(atts.hasNext())
    		 {
    			 Attribute att = (Attribute) atts.next();
    			 DefaultMutableTreeNode attNode = new DefaultMutableTreeNode("@"+att.getName());
    			 attNode.add(new DefaultMutableTreeNode(att.getValue()));
    			 dmtn.add(attNode);
    		 }
    	 }*/
     
    }
    Ceci fonctionnant parfaitement pour ce que je veux faire

    F.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/03/2012, 15h00
  2. [JDOM] XML Node et XPATH
    Par ecatum dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 15/01/2008, 17h09
  3. [JAVA] XML Node et XPATH
    Par ecatum dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 11/01/2008, 09h38
  4. [Jtree] expand node
    Par nannous dans le forum Composants
    Réponses: 1
    Dernier message: 14/03/2006, 14h17
  5. [JDOM] XML Node JDOM
    Par quidam66 dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 14/09/2005, 23h15

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