Jtree et defaultmutabletreenode [Résolu]

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

Votre réponse

21 réponses

Meilleure réponse
Messages postés
493
Date d'inscription
samedi 20 mai 2006
Dernière intervention
15 juillet 2012
- 19 déc. 2008 à 14:52
3
Merci
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.

Merci uhrand 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

Commenter la réponse de uhrand
Meilleure réponse
Messages postés
493
Date d'inscription
samedi 20 mai 2006
Dernière intervention
15 juillet 2012
- 13 janv. 2009 à 15:42
3
Merci
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.

Merci uhrand 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

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