Jtree et defaultmutabletreenode

Résolu
cs_coltman Messages postés 97 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 10 février 2009 - 18 déc. 2008 à 17:42
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 - 13 janv. 2009 à 22:51
Bonjour, j'aurais une question concernant les jtree :

est-ce que l'on peut stocker des objets dans les defaultmutabletreenode comme ca :

DefaultMutableTreeNode racine = new DefaultMutableTreeNode(new Joueur("les boss"));
DefaultMutableTreeNode node = new DefaultMutableTreeNode(new Joueur("zizou"));

racine.add(node);

JTree essai = new JTree(rootnode);

sachant que Joueur est une classe qui se presente ainsi

public class Joueur {

public String name;
public String ID;

public Joueur (String nom) {

this.name=nom;

}

}

je veux en gros mettre dans mon jtree des instances de Joueur pour des raisons pratiques disons puisque je peux génerer un ID à chaque joueur et le récupérer quand je veux ....

merci d'avance pour vos réponses

21 réponses

uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
19 déc. 2008 à 14:52
Comme je l'ai dis, nous pouvons ajouter la méthode "toString" à la classe Joueur:

public String toString() {
    return name;
}

le nom sera alors rendu dans le JTree.
3
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
13 janv. 2009 à 15:42
Si maintenant, avec l'exemple que j'ai montré, tu sélectionne un noeud et tu exécute ceci:

Joueur arthur = null;
DefaultMutableTreeNode dmtn = null;
dmtn = (DefaultMutableTreeNode) monArbre.getLastSelectedPathComponent();
Object o = dmtn.getUserObject();
if (o instanceof Joueur) {
    arthur = (Joueur) dmtn.getUserObject();
    String ID_needed = arthur.ID;
    System.out.println("ID_needed: " + ID_needed);
}else{
    JOptionPane.showMessageDialog(this, "Le noeud sélectionné n'est pas un Joueur");
}

alors tu n'aura pas de problème.
3
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
19 déc. 2008 à 03:26
C'est absolument correct (supposant que "rootnode" correspond à "racine").
En plus, nous pouvons ajouter la méthode "toString" à la classe Joueur:

public String toString() {
    return name;
}

le nom sera alors rendu dans le JTree.
La méthode "getUserObject" permet d'accéder au joueur par après:

Joueur joueur = (Joueur) node.getUserObject();
0
cs_coltman Messages postés 97 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 10 février 2009
19 déc. 2008 à 09:38
ok ! mais faut-il néanmois changer quelquechose dans le treecellrender ou le treecelleditor pour qu'il puisse afficher les noeuds, c'est a dire comment le composant jtree va-t-il comprendre qu'il faut afficher dans l'arbre Joueur.name ?

merci !
0

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

Posez votre question
cs_coltman Messages postés 97 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 10 février 2009
8 janv. 2009 à 17:59
bonjour,

je relance un peu le topic.

en partant toujours sur le meme exemple, j'ai en fait dans mon arbre des instances de Joueur. Cepedant quand je fait la manipulation suivante pour pourvoir extraire l'ID du Joueur et j'ai une erreur :

Joueur arthur = null;
arthur= (Joueur)MonArbre.getLastSeletedPathComponent();
System.out.println(arthur.ID);

l'erreur me dit qu'il est incapable d'effectuer le cast que je fais ... plus exactement il me dit qu'il est incapable de convertir un DefaultMutableTreeNode en Joueur ....

y a-t-il une erreur effectivement dans ce que je fais ?

comment puis-je alors récupérer mon objet depuis l'arbre ?
0
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
8 janv. 2009 à 22:44
arthur= (Joueur)((DefaultMutableTreeNode)MonArbre.getLastSelectedPathComponent()).getUserObject();
0
cs_coltman Messages postés 97 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 10 février 2009
9 janv. 2009 à 00:59
merci uhrand pour la réponse !!

une petite question qui peut paraitre bete mais si je comprends bien :

la methode getlastselectedpathcomponent permet de récuperer un element de l'arbre sauf que le compilateur ne sait pas de quel objet il s'agit précisément...on ne peut donc pas agir dessus comme on le voulait à la base. on le cast donc en defaulmutabletreenode et on recupere l'objet joueur a partir du defaultmutabletreenode pour pouvoir le manipuler ...

pourquoi faut-il obligatoirement caster le retour de getlastselectedcomponent en defaultmutabletreenode s'il faut recaster apres le retour de la methode getuserobject qui a un principe de fonctionnement analogue à celui de getlastselectedcomponent ? pourquoi ça ne passe pas en castant directement le retour de getlastselectedcomponent en Joueur comme je l'avais fais (à tort certes) ainsi :

arthur= (Joueur)MonArbre.getLastSeletedPathComponent();



merci pour les explications :)
0
cs_coltman Messages postés 97 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 10 février 2009
9 janv. 2009 à 01:01
merci uhrand pour la réponse !!

une petite question qui peut paraitre bete mais si je comprends bien :

la methode getlastselectedpathcomponent permet de récuperer un element de l'arbre sauf que le compilateur ne sait pas de quel objet il s'agit précisément...on ne peut donc pas agir dessus comme on le voulait à la base. on le cast donc en defaulmutabletreenode et on recupere l'objet joueur a partir du defaultmutabletreenode pour pouvoir le manipuler ...

pourquoi faut-il obligatoirement caster le retour de getlastselectedcomponent en defaultmutabletreenode s'il faut recaster apres le retour de la methode getuserobject qui a un principe de fonctionnement analogue à celui de getlastselectedcomponent ?

pourquoi ça ne passe pas en castant directement le retour de getlastselectedcomponent en Joueur comme je l'avais fais (à tort certes) ainsi :

arthur= (Joueur)MonArbre.getLastSeletedPathComponent();


merci pour les explications :)
0
cs_coltman Messages postés 97 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 10 février 2009
9 janv. 2009 à 01:02
désolé pour le texte illisible mais j'ai mis des espaces un peu partout pour que ce soit plus facile à lire mais ça ne passe pas ... :s
0
cs_coltman Messages postés 97 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 10 février 2009
9 janv. 2009 à 20:06
merci uhrand pour la réponse !!

une petite question qui peut paraitre bete mais si je comprends bien :

la methode getlastselectedpathcomponent permet de récuperer un element de l'arbre sauf que le compilateur ne sait pas de quel objet il s'agit précisément...on ne peut donc pas agir dessus comme on le voulait à la base. on le cast donc en defaulmutabletreenode et on recupere l'objet joueur a partir du defaultmutabletreenode pour pouvoir le manipuler ...

pourquoi faut-il obligatoirement caster le retour de getlastselectedcomponent en defaultmutabletreenode s'il faut recaster apres le retour de la methode getuserobject qui a un principe de fonctionnement analogue à celui de getlastselectedcomponent ?

pourquoi ça ne passe pas en castant directement le retour de getlastselectedcomponent en Joueur comme je l'avais fais (à tort certes) ainsi :

arthur= (Joueur)MonArbre.getLastSeletedPathComponent();


merci pour les explications :)
0
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
10 janv. 2009 à 01:39
Parce que Joueur n'est pas un TreeNode.
0
cs_coltman Messages postés 97 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 10 février 2009
12 janv. 2009 à 11:42
bonjour, j'ai essayé le code proposé à savoir :

1.
Joueur arthur = null;
2.
DefaultMutableTreeNode dmtn = null;

3.
dmtn = (DefaultMutableTreeNode)MonArbre.getLastSelectedPathCompenent();
4.
arthur = (Joueur)dmtn.getUserObject();

5.
String ID_needed = arthur.ID;

mais ca me retourne l'exception suivante :

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String cannot be cast to Threat

Pourquoi me retourne-t-il une telle exception ? enfin pourquoi s'agit-il d'une exception sur String puisque la methode getuserobject me permet de recuperer un objet de type Joueur ...

merci ...
0
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
12 janv. 2009 à 16:38
Je ne vois pas de rapport avec le code indiqué, car il ne contient aucune  référence à la classe "Threat". Est-tu certain de la ligne qui cause l'exception?
0
cs_coltman Messages postés 97 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 10 février 2009
12 janv. 2009 à 16:47
oui excuse moi ... en fait Threat c'est une classe que j'ai, et comme c'est un projet plus ou moins confidentiel, j'utilise des exemples style Joueur ... dans ce forum j'utilise Joueur comme classe analogue à Threat ... donc typiquement l'erreur retournée serait :

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String cannot be cast to Joueur
0
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
13 janv. 2009 à 01:01
Si ceci:
arthur = (Joueur)dmtn.getUserObject();

génère ceci:
ClassCastException: java.lang.String cannot be cast to Joueur

alors probablement tu as mis un TreeNode qui ne contient pas un UserObject de la classe "Joueur".
0
cs_coltman Messages postés 97 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 10 février 2009
13 janv. 2009 à 09:51
oui c'est la seule explication possible ... je dois donc faire l'erreur au niveau de la creation de mes TreeNode. En fait, j'ai une interface graphique qui me permet de créer des noeuds d'un arbre ... Quand je clique par exemple sur le bouton "Ajouter Element" l'action executée est :

Joueur nouveau = new Joueur();
DefaultMutableTreeNode newnode = new DefaultMutableTreeNode(nouveau);
DefaultMutableTreeNode selectednode = null;
selectednode = MonArbre.getLastSelectedComponentPath();
selectednode.add(newnode);

donc logiquement cette action me permet en fait de créer des noeuds de type Joueur ... Y a-t-il une erreur ici ? -elle ne pourrait venir que de là d'après l'exception générée mais je ne la situe pas ...-
0
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
13 janv. 2009 à 10:48
Tu peus essayer avec la méthode DefaultTreeModel#insertNodeInto
0
cs_coltman Messages postés 97 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 10 février 2009
13 janv. 2009 à 12:14
oh lala je ne sais pas quoi faire ca me retourne toujours la meme erreur ... je fais super gaffe pourtant je ne vois pas ou ca bloque vraiment pas ... :s
0
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
13 janv. 2009 à 15:32
/*
 * JoueurDemo.java
 */


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;


public class JoueurDemo extends JFrame {


    private JButton btAdd;
    private JTree monArbre;
    private JToolBar toolbar;
    private DefaultTreeModel model;
    private TreeNode root;
    private int count;


    public JoueurDemo() {
        initComponents();
        root = new DefaultMutableTreeNode("Joueurs");
        model = new DefaultTreeModel(root);
        monArbre.setModel(model);
    }


    private void initComponents() {
        monArbre = new JTree();
        toolbar = new JToolBar();
        btAdd = new JButton("Ajouter un noeud enfant");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        getContentPane().add(new JScrollPane(monArbre), BorderLayout.CENTER);
        toolbar.setRollover(true);
        btAdd.addActionListener(new ActionListener() {


            public void actionPerformed(final ActionEvent evt) {
                btAddActionPerformed(evt);
            }
        });
        toolbar.add(btAdd);
        getContentPane().add(toolbar, BorderLayout.PAGE_START);
        pack();
    }


    private void btAddActionPerformed(final ActionEvent evt) {
        Joueur nouveau = new Joueur(count++);
        DefaultMutableTreeNode newnode = new DefaultMutableTreeNode(nouveau);
        DefaultMutableTreeNode selectednode = null;
        selectednode = (DefaultMutableTreeNode) monArbre.getLastSelectedPathComponent();
        if (selectednode != null) {
            model.insertNodeInto(newnode, selectednode, selectednode.getChildCount());
        } else {
            JOptionPane.showMessageDialog(this, "Sélectionne un noeud parent s.t.p");
        }
    }


    public static void main(final String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {


            public void run() {
                new JoueurDemo().setVisible(true);
            }
        });
    }
}


class Joueur {


    private int i;


    public Joueur(final int i) {
        this.i = i;
    }


    @Override
    public String toString() {
        return "Joueur " + i;
    }
}
0
cs_coltman Messages postés 97 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 10 février 2009
13 janv. 2009 à 17:08
oh yeah ! thanks ca a l'air de marcher là ... mais dites moi quelle est la logique derriere tout ca ... cette derniere manip revient au meme a celles d'avant ... pourquoi ca ne marchais quand meme pas ?
0
Rejoignez-nous