Jtree et defaultmutabletreenode [Résolu]

cs_coltman 97 Messages postés jeudi 3 janvier 2008Date d'inscription 10 février 2009 Dernière intervention - 18 déc. 2008 à 17:42 - Dernière réponse : uhrand 493 Messages postés samedi 20 mai 2006Date d'inscription 15 juillet 2012 Dernière intervention
- 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
Afficher la suite 

21 réponses

Répondre au sujet
uhrand 493 Messages postés samedi 20 mai 2006Date d'inscription 15 juillet 2012 Dernière intervention - 19 déc. 2008 à 14:52
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de uhrand
uhrand 493 Messages postés samedi 20 mai 2006Date d'inscription 15 juillet 2012 Dernière intervention - 13 janv. 2009 à 15:42
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de uhrand
uhrand 493 Messages postés samedi 20 mai 2006Date d'inscription 15 juillet 2012 Dernière intervention - 19 déc. 2008 à 03:26
0
Utile
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();
Commenter la réponse de uhrand
cs_coltman 97 Messages postés jeudi 3 janvier 2008Date d'inscription 10 février 2009 Dernière intervention - 19 déc. 2008 à 09:38
0
Utile
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 !
Commenter la réponse de cs_coltman
cs_coltman 97 Messages postés jeudi 3 janvier 2008Date d'inscription 10 février 2009 Dernière intervention - 8 janv. 2009 à 17:59
0
Utile
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 ?
Commenter la réponse de cs_coltman
uhrand 493 Messages postés samedi 20 mai 2006Date d'inscription 15 juillet 2012 Dernière intervention - 8 janv. 2009 à 22:44
0
Utile
arthur= (Joueur)((DefaultMutableTreeNode)MonArbre.getLastSelectedPathComponent()).getUserObject();
Commenter la réponse de uhrand
cs_coltman 97 Messages postés jeudi 3 janvier 2008Date d'inscription 10 février 2009 Dernière intervention - 9 janv. 2009 à 00:59
0
Utile
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 :)
Commenter la réponse de cs_coltman
cs_coltman 97 Messages postés jeudi 3 janvier 2008Date d'inscription 10 février 2009 Dernière intervention - 9 janv. 2009 à 01:01
0
Utile
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 :)
Commenter la réponse de cs_coltman
cs_coltman 97 Messages postés jeudi 3 janvier 2008Date d'inscription 10 février 2009 Dernière intervention - 9 janv. 2009 à 01:02
0
Utile
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
Commenter la réponse de cs_coltman
cs_coltman 97 Messages postés jeudi 3 janvier 2008Date d'inscription 10 février 2009 Dernière intervention - 9 janv. 2009 à 20:06
0
Utile
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 :)
Commenter la réponse de cs_coltman
uhrand 493 Messages postés samedi 20 mai 2006Date d'inscription 15 juillet 2012 Dernière intervention - 10 janv. 2009 à 01:39
0
Utile
Parce que Joueur n'est pas un TreeNode.
Commenter la réponse de uhrand
cs_coltman 97 Messages postés jeudi 3 janvier 2008Date d'inscription 10 février 2009 Dernière intervention - 12 janv. 2009 à 11:42
0
Utile
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 ...
Commenter la réponse de cs_coltman
uhrand 493 Messages postés samedi 20 mai 2006Date d'inscription 15 juillet 2012 Dernière intervention - 12 janv. 2009 à 16:38
0
Utile
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?
Commenter la réponse de uhrand
cs_coltman 97 Messages postés jeudi 3 janvier 2008Date d'inscription 10 février 2009 Dernière intervention - 12 janv. 2009 à 16:47
0
Utile
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
Commenter la réponse de cs_coltman
uhrand 493 Messages postés samedi 20 mai 2006Date d'inscription 15 juillet 2012 Dernière intervention - 13 janv. 2009 à 01:01
0
Utile
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".
Commenter la réponse de uhrand
cs_coltman 97 Messages postés jeudi 3 janvier 2008Date d'inscription 10 février 2009 Dernière intervention - 13 janv. 2009 à 09:51
0
Utile
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 ...-
Commenter la réponse de cs_coltman
uhrand 493 Messages postés samedi 20 mai 2006Date d'inscription 15 juillet 2012 Dernière intervention - 13 janv. 2009 à 10:48
0
Utile
Tu peus essayer avec la méthode DefaultTreeModel#insertNodeInto
Commenter la réponse de uhrand
cs_coltman 97 Messages postés jeudi 3 janvier 2008Date d'inscription 10 février 2009 Dernière intervention - 13 janv. 2009 à 12:14
0
Utile
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
Commenter la réponse de cs_coltman
uhrand 493 Messages postés samedi 20 mai 2006Date d'inscription 15 juillet 2012 Dernière intervention - 13 janv. 2009 à 15:32
0
Utile
/*
 * 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;
    }
}
Commenter la réponse de uhrand
cs_coltman 97 Messages postés jeudi 3 janvier 2008Date d'inscription 10 février 2009 Dernière intervention - 13 janv. 2009 à 17:08
0
Utile
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 ?
Commenter la réponse de cs_coltman

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.

jtree et defaultmutabletreenode - page 2