Sauvegarde/chargement d'un jtree

DamS2502 Messages postés 3 Date d'inscription mardi 2 octobre 2007 Statut Membre Dernière intervention 14 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?


Merci d'avance

7 réponses

Utilisateur anonyme
14 avril 2008 à 12:43
Bonjour

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.

TUER : http://tuer.tuxfamily.org/tuer.php

yeah! vive java
0
DamS2502 Messages postés 3 Date d'inscription mardi 2 octobre 2007 Statut Membre Dernière intervention 14 avril 2008
14 avril 2008 à 13:31
<hr style= "color: rgb(209, 209, 225);" size="1" />
<!-- / icon and title -->
<!-- message -->



j'ai essayé quelque chose comme sa avec des XMLEncoder et XMLDecoder mais sans résultat :/

    private void SaveButtonMouseClicked(java.awt.event.MouseEvent evt) {
        try {
            XMLEncoder encoder = new XMLEncoder(new BufferedOutputStream(new FileOutputStream("tree.xml")));
            encoder.writeObject(myTree.getModel());
            encoder.close();
            System.out.println("[DEBUG] JTree sauvegardé");
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Display.class.getName()).log(Level.SEVERE, null, ex);
        }       
    }

    private void LoadButtonMouseClicked(java.awt.event.MouseEvent evt) {
        try {
            XMLDecoder decoder = new XMLDecoder(new BufferedInputStream(new FileInputStream("tree.xml")));
            TreeModel model = (TreeModel)decoder.readObject();
            decoder.close();
            myTree = null;
            if( model != null )
                myTree = new JTree( model );
            else
                myTree = new JTree();
            System.out.println("[DEBUG] JTree chargé");
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Display.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
0
Twinuts Messages postés 5373 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 10 août 2022 110
14 avril 2008 à 14:42
<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" />
<title>
</title>
<meta name="GENERATOR" content="OpenOffice.org 2.4 (Linux)" />
<style type="text/css">
<!--
@page { size: 21cm 29.7cm; margin: 2cm }
P { margin-bottom: 0.21cm }
-->
</style>
Salut,

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 ..."

OoWORAoO
0
DamS2502 Messages postés 3 Date d'inscription mardi 2 octobre 2007 Statut Membre Dernière intervention 14 avril 2008
14 avril 2008 à 15:14
j'ai trouvé une autre solution mais qui à l'air de marcher très bien. la serialization du jtree complet. voilà ce que sa donne:

    private void SaveButtonMouseClicked(java.awt.event.MouseEvent evt) {
        try {
            FileOutputStream fichier = new FileOutputStream("myTree.ser");
            ObjectOutputStream oos = new ObjectOutputStream(fichier);
            oos.writeObject(myTree);
            oos.flush();
            oos.close();
            System.out.println("[DEBUG] JTree sauvegardé");
        }
        catch (java.io.IOException e) {
            e.printStackTrace();
        }
    }

    private void LoadButtonMouseClicked(java.awt.event.MouseEvent evt) {
        try {
            FileInputStream fichier = new FileInputStream("myTree.ser");
            ObjectInputStream ois = new ObjectInputStream(fichier);
            JTree tempTree = (JTree)ois.readObject();
            myTree.setModel(tempTree.getModel());
            System.out.println("[DEBUG] JTree chargé");
        }
        catch (java.io.IOException e) {
            e.printStackTrace();
        }
        catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
14 avril 2008 à 19:27
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.

TUER : http://tuer.tuxfamily.org/tuer.php

yeah! vive java
0
Twinuts Messages postés 5373 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 10 août 2022 110
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 ..."

OoWORAoO
0
Utilisateur anonyme
15 avril 2008 à 07:24
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.

TUER : http://tuer.tuxfamily.org/tuer.php

yeah! vive java
0