DamS2502
Messages postés3Date d'inscriptionmardi 2 octobre 2007StatutMembreDernière intervention14 avril 2008
-
14 avril 2008 à 11:41
Utilisateur anonyme -
15 avril 2008 à 07:24
Bonjour, j'aurais besoin de pouvoir sauvegarder l'arborescence d'un
jtree puis de la recharger par la suite. Le problème est que je n'ai
aucune idée de la façon de coder celà ! J'ai un jtree myTree ainsi qu'un bouton saveButton qui ouvrira un explorateur myFileChooser permettant de sélectionner l'endroit ou le fichier de sauvegarde sera
placé. Il faudra ensuite pouvoir réouvrir se fichier grâce au bouton loadButton et charger l'arborescence.
Pourriez-vous m'aider quand au code à placer dans les fonctions saveButtonMouseClicked ainsi que le loadButtonMouseClicked?
Va voir du côté de la sérialisation Java (va voir l'interface Serializable, les classes ObjectInputStream et ObjectOutputStream), tu peux aussi passer par la classe XMLEncoder et son pendant XMLDecoder. Un conseil : surtout ne sérialise pas en binaire des composants Swing (ou des composants qui en héritent) ou bien tu auras des soucis si quelqu'un en Java 1.5 ouvre un fichier qui représente un composant Swing sérialisé avec Java 1.6 (tu auras déjà une exception à cause de la différence de serial version UID). Bon courage.
perso je te déconseille
fortement d'utiliser la sérialisation XML pour un objet aussi
complexe que le JTree.... le mieux serait de balayer le root node
pour le placer dans une liste et ensuite de sérialiser celle-ci...
exemple pour passer d'un DefaultMutableTreeNode vers une List:
@SuppressWarnings("unchecked")
private List<Object> getChild(Object root) {
if (root != null) {
List<Object> child = new ArrayList<Object>(1);
DefaultMutableTreeNode rootNode = (DefaultMutableTreeNode) root;
int count = rootNode.getChildCount();
if (count != 0)
child.add(rootNode);
Enumeration<Object> en = rootNode.children();
while (en.hasMoreElements()) {
Object node = en.nextElement();
if (((DefaultMutableTreeNode) node).children() != null)
child.add(getChild(((DefaultMutableTreeNode) node)));
}
if (count == 0)
child.add(rootNode);
return child;
} else
return null;
}
exemple pour passer d'une List vers un DefaultMutableTreeNode :
@SuppressWarnings("unchecked")
private DefaultMutableTreeNode load(List<Object> arr) {
DefaultMutableTreeNode node = new DefaultMutableTreeNode();
node = (DefaultMutableTreeNode)arr.get(0);
DefaultMutableTreeNode child;
for (int i = 1; i < arr.size(); i++) {
Object specifier = arr.get(i);
if (List.class.isInstace(specifier))
child = load((List) specifier);
else{
child = new DefaultMutableTreeNode();
child = (DefaultMutableTreeNode)specifier;
}
node.add(child);
}
return (node);
}
------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."
il suffit ensuite d'ajoute un implements java.io.Serializable à ma classe item (chaques noeuds de mon arbre est un item) et sa récupère l'arborescence et les nom comme il le faut.
merci de votre aide
Vous n’avez pas trouvé la réponse que vous recherchez ?
Bon sang tu ne lis même pas ce que je t'ai écrit : "surtout ne sérialise pas en binaire des composants Swing". Ta méthode ne marche pas dès que tu changes de JVM. Fais ça un peu plus intelligemment. Voilà pourquoi je t'ai averti (cf. la documentation Java) :
"Warning: Serialized objects of this class will not be compatible with
future Swing releases. "
Il faut que tu fixes le serial version UID dans ta classe "item" et que tu ne sérialises que ça et le strict nécessaire pour reconstruire le JTree à la désérialisation (dans une méthode void readResolve(Object object) par exemple, et en déclarant le JTree transient).
Après, fais comme tu veux. Si tu veux te contenter d'un truc crade, c'est ton problème.
Twinuts
Messages postés5375Date d'inscriptiondimanche 4 mai 2003StatutModérateurDernière intervention14 juin 2023111 14 avril 2008 à 20:28
Salut,
calme l'ami ^^, je pense que [auteur/DAMS2502/1161436.aspx DamS2502] à fait bonne note de ce que tu as dit.
<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" /><title></title><meta name="GENERATOR" content="OpenOffice.org 2.3 (Linux)" /><style type="text/css"><!--
@page { size: 21cm 29.7cm; margin: 2cm }
P { margin-bottom: 0.21cm }
--></style>Perso, je sais bien ce qui est dans la
javadoc, mais les bonnes résolutions sont souvent plus
lourdes... pour ma part, je sais que la sérialisation XML d'un
gros (très gros) JTree n'est pas viable sans perdre un temps
monstrueux (voir sans se taper une exception)... c'est pour quoi je
préconise (ça reste mon avis) plus l'aspect
'sérialisation d'une collection' (binaire ou non) au détriment
de la portabilitée du code (bien qu'un patch des fichiers
reste possible ^^) en fonction de la version de la VM.
Note :
(cette note concerne les updates d'un JTree sauce API et non d'un
JTree fait pour une seule et unique application)
J'ai eu
l'occasion de remarquer que la sérialisation (binaire ou non)
d'un JTree complet n'est pas viable non plus et ce à cause des
différents modèles que tu peux lui mettre et qui ne
sont pas forcément sérialisables...
------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."
On peut avoir le beurre et l'argent du beurre alors pourquoi s'en passer? Il ne faut surtout pas encourager les gens à sérialiser des composants Swing car tu sais très bien ce que ça donne. C'est rare que tous les utilisateurs d'une application ait exactement la même version de la JVM... Je suis d'accord que l'encodeur XML peut prendre un temps fou sur un composant complexe, c'est pourquoi j'ai proposé une solution intermédiaire qui utilise la sérialisation binaire mais qui ne sérialise pas le composant lui-même.