Enregistrer l'arborescence d'un jtree dans un xml avec jdom

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 371 fois - Téléchargée 17 fois

Contenu du snippet

Peu de souces et forums sur le net proposent une solution.

Je vous propose donc une classe qui permet d'enregistrer l'arborescence d'un JTree dans un fichier XML grâce aux plus simples et maniables des API pour XML, JDOM. Cela peut avoir beaucoup d'applications.

Dans mon exemple j'ai un JTree composé de noeud DefaultMutableTreeNode et contenant des objets de type Joueur.

Voilà, pour toute remarque question ou observation envoyer moi un MP.

Source / Exemple :


import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Enumeration;

import javax.swing.tree.DefaultMutableTreeNode;

import org.jdom.*;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

public class TreetoXML {
	
	public Element xmlrootelement=null;
	public Document treetoxmldoc=null;
	
	public TreetoXML (DefaultMutableTreeNode MONARBREtreerootnode) {
		
		xmlrootelement=new Element("Mon_Arbre");
		treetoxmldoc=new Document(xmlrootelement);
		this.execute(MONARBREtreerootnode, xmlrootelement);
		
	}
	
	public void execute (DefaultMutableTreeNode node, Element parelement) { 
		
		Object o = node.getUserObject();
		
		if (o instanceof Joueur) {
							
				Enumeration enumchildren = node.children();
				
				while (enumchildren.hasMoreElements()) {
					
					DefaultMutableTreeNode currentnode=(DefaultMutableTreeNode) enumchildren.nextElement();
					Object p = currentnode.getUserObject();
					
					if (p instanceof Joueur ) {
						
							
							
							Element newelement;
							
							if (currentnode.isLeaf()) {
								
								newelement = new Element("Joueur");
							}
							
							else {
								
								newelement = new Element("Category");
								
							}

							Joueur newth = null;
							newth = (Joueur) currentnode.getUserObject();

							newelement.setAttribute("Name", newth.Name);
							newelement.setAttribute("ID", newth.ID);
							
							parelement.addContent(newelement);
							
							if (currentnode.isLeaf()==false) {
								
							execute(currentnode,newelement);
							
						}
					}
				}
				
		}
	}

	public void save () {
		
		XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
        try {
			sortie.output(treetoxmldoc, new FileOutputStream("C:/Data/Coltman/Desktop/MonArbreEnXML.xml"));
		} catch (FileNotFoundException e1) {
			System.out.println(e1.getMessage());
		} catch (IOException e1) {
			System.out.println(e1.getMessage());
			}
		
	}
}

A voir également

Ajouter un commentaire

Commentaires

cs_PERRYALAIN
Messages postés
3
Date d'inscription
lundi 15 mai 2006
Statut
Membre
Dernière intervention
4 février 2009
-
Bonjour,

Je ne saisis pas ce code : on dirait qu'il prévoit un arbre dans lequel il y a des noeuds Joueur, mais également pour un noeud Joueur, potentiellement un noeud Joueur ou un noeud Category.
Dans quelle situation réelle peut-on avoir des joueurs de joueurs de joueurs ...

Rien qu'à l'oeil, le code doit planter en liste 57 pour un pb de casting, non ?

Il semble aussi quand on regarde l'indentation entre ligne 30 et 32 qu'une bonne partie du code a disparu.
uhrand
Messages postés
493
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
15 juillet 2012
8 -
Pour XMLEncoder, il suffit que les objets respectent le format "Bean", qui est extrèmement simple:

une public class où nous ajoutons un constructeur sans paramètres et les méthodes setXXX et getXXX(ou isXXX) pour les propriétés.

Et voilà, c'est déjà tous pourque ça fonctionne!
cs_coltman
Messages postés
97
Date d'inscription
jeudi 3 janvier 2008
Statut
Membre
Dernière intervention
10 février 2009
-
Ah oui c'est vrai que c'est plus simple et plus court ... cependant si on traite des objets bien particuliers dans le jtree je ne pense pas que ca tournera avec le XMLEncoder
uhrand
Messages postés
493
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
15 juillet 2012
8 -
J'ai toujours utilisé simplement XMLEncoder pour sauvegarder et charger mes JTree. Par exemple:

private void save(){
try{
FileOutputStream fos = new FileOutputStream(filename);
XMLEncoder o = new XMLEncoder(new BufferedOutputStream(fos));
o.writeObject(tree.getModel());
o.close();
}catch( IOException e){
e.printStackTrace();
}
}

private void load(){
try {
XMLDecoder d = new XMLDecoder(new BufferedInputStream(new FileInputStream(filename)));
tree.setModel((TreeModel)d.readObject());
d.close();
} catch (FileNotFoundException ex) {
ex.printStackTrace();
}
}

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.