IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

[SWING] TreeSelectionListener


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 18
    Par défaut [SWING] TreeSelectionListener
    bonjour,
    j'ai un TreeSelectionListener qui selectionne donc
    un noeud d'un JTree lorsque je clique.

    Comment fait on pour connaitre l'evenement / touche
    qui a sélectionné le noeud?
    dans valueChanged(TreeSelectionEvent evt)

    merci

  2. #2
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    bonsoir,

    cette information n'est pas disponible dans l'événement. Pour quelle raison en as tu besoin ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 18
    Par défaut
    Je veux associer a mes branches un clic droit, un double clic
    et un clic droit.
    Le but serait que lorsque il s'agit d'un noeud, je n'ai que
    le clic droit, le double clic servant dans ce cas la à déployer.
    Donc en gros :
    branche =
    clic, double clic personnalisé, clic droit

    noeud =
    clic droit, double clic de déploiement

    Si je passe par des mouseListener, je suis obligé de cliquer une
    premiere fois sur la branche pour la selectionner, ce qui donne la
    possibilité ensuite d'utiliser les clics.

    J'ai donc essayer directement par le gestionnaire de sélection pour
    éviter ce probleme, mais je suis bloquer.

    Sinon, je pense qu'il serait mieux d'utiliser le mouseListener,
    mais comment désactiver la sélection (ou plutot comment renvoyer
    l'event)

    Mon jtree est composé d'un treeCellRenderer perso et l'édition est activé

  4. #4
    Membre chevronné Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Par défaut
    Je ne comprend pas branche et noeud. Tu veux dire noeud et feuille plutot?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        if (node.isLeaf()) { // ==> rend TRUE si c'est une feuille, FALSE sinon, (et donc ce sera une branche)
       }

    Je sais que tu sais le faire, mais voila une petite partie, j'ai un truc du genre dans mon appli (triple click = modifier le noeud; click droit = activer un popup, click normal = ouvrir noeud si ce n'est pas une feuille)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     public void mouseClicked(MouseEvent e) {
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); // récupère le dernier noeud selectionné
     
        if (node == null) return; // aucun noeud selectionné, on ne fait rien!
     
     
     
        // triple click par exemple!
        if (e.getClickCount() == 3) {
              ....
          }
        }
      }

    Billy

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 18
    Par défaut
    bonne idée !
    je m'en suis inspiré ...

    existe-t-il un moyen de 'forwarder' l'action de clic ?
    je veux dire:
    -je suis au niveau du JTree, je clic
    -le clic est capturé par le MouseListener du JTree
    -à ce moment la, je voudrais relancer l'event pour que ce
    coup la, mon Listener situé au niveau de la node le capte
    (MouseListener ajouté sur un des JPanel composant la ligne
    affichée dans le JTree).
    c'est possible?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 167
    Par défaut
    J'ai fais un petit How To sur les JTree...je te le file...je sais pas si tu y trouvera ton bonheur...
    J'espère que je pollue pas....

    Jtree

    Création d'un Jtree

    //Création du noeud racine
    DefaultMutableTreeNode root;
    //Création du Jtree, en spécifiant le noeud racine (qu'il faut bien entendu initialiser)
    jtree = new Jtree(root);
    //Mode de fonctionnement du Jtree (sélection simple ou multiple)
    jtree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);

    Remplissage d'un Jtree

    Exemple, Jtree a trois niveau racine, groupement, élément
    On a déjà la racine:
    DefaultMutableTreeNode root;
    root= new DefaultMutableTreeNode("Structure complète");
    On crée alors les groupements (exemple 2 groupements)
    DefaultMutableTreeNode grp1 = new DefaultMutableTreeNode(Object);
    DefaultMutableTreeNode grp2 = new DefaultMutableTreeNode(Object);
    DefaultMutableTreeNode prend en paramètre un Object, donc on peux y mettre ce que l'on souhaite...
    J'ajoute donc mes groupements a ma racine:
    root.add(grp1);
    root.add(grp2);
    Puis, de la même manière j'ajoute mes éléments à mes groupements:
    DefaultMutableTreeNode child1 = new DefaultMutableTreeNode(Object);
    grp1.add(child1);
    et ainsi de suite....

    Regénération complète de l'arbre

    //on enlève tous les éléments de la racine
    root.removeAllChildren();
    //On crée donc une nouvelle racine que l'on applique à l'arbre
    jtree.setModel(new DefaultTreeModel(new_root));
    //On rafraichit l'arbre au niveau de la racine
    ( (DefaultTreeModel)jtree.getModel()).nodeStructureChanged( (TreeNode) root);

    Evenements Jtree

    1.Gestion du clique droit
    jtree.addMouseListener(
    new MouseAdapter() {
    public void mouseReleased(MouseEvent e) {
    //Gestion du clic droit...evenement pas répéré de la même manière sous windows ou linux, d'où 2 cas
    //La première fonctionne sous windows, mais pas sous linux
    if (e.isPopupTrigger()) {
    //Action a faire
    }
    //La seconde fonctionne a priori sous les deux systèmes
    else if(SwingUtilities.isRightMouseButton(e)) {
    //Action a faire
    }
    }
    }
    );

    2.Gestion d'un événements de type ActionListener
    public void actionPerformed(ActionEvent ae) {
    //Permet de connaître le dernier élémnets sélectionné du Jtree
    DefaultMutableTreeNode node = (DefaultMutableTreeNode) jtree.getLastSelectedPathComponent();
    //Test si le noeud n'est pas vide, et n'est pas la racine
    if ( (node != null) && (!node.isRoot()) {
    //Récupération de l'objet contenu dans le Jtree
    MonType mt = (MonType)node.getUserObject();
    }
    }

    3.Ecoute d'un Jtree (change d'item sélectionné)
    Implémenter TreeSelectionListener
    Puis surcharger la méthode:
    public void valueChanged(TreeSelectionEvent e) {
    DefaultMutableTreeNode node = (DefaultMutableTreeNode) jtree.getLastSelectedPathComponent();
    if ( (node != null) && (!node.isRoot())) {
    node.getUserObject();
    }
    }

    4.Sélection d'un noeud
    jtree.addMouseListener(new MouseAdapter() {
    public void mouseReleased(MouseEvent e) {
    //Récupère le dernier noeud sélectionné
    DefaultMutableTreeNode node = (DefaultMutableTreeNode) jtree.getLastSelectedPathComponent();
    if ((node != null) && (!node.isRoot())) {
    //action a réaliser
    }
    }
    });

    5.Gestion du survole
    jtree.addMouseMotionListener(new MouseMotionAdapter() {
    public void mouseMoved(MouseEvent e) {
    //Récupère le chemin du noeud survolé en fonction des coordonnées de la souris
    TreePath selPath = jtree.getPathForLocation(e.getX(), e.getY());
    if (selPath != null) {
    //A partir du chemin, on récupère le noeud
    DefaultMutableTreeNode node = (DefaultMutableTreeNode) selPath.getLastPathComponent();
    if ((node != null) && (!node.isRoot())) {
    //action a faire
    }
    }
    }
    });
    Gestion des icones utilisés dans le Jtree

    Pour cela il faut utiliser un Renderer:
    Le plus simple est de surcharger la classe DefaultTreeCellRenderer

    MyRenderer myRenderer = new MyRenderer();
    jtree.setCellRenderer(myRrr);
    public class MyRenderer extends DefaultTreeCellRenderer {
    public MyRenderer() {
    super();
    }
    //Redéfini la méthode getTreeCellRendererComponent
    public Component getTreeCellRendererComponent(JTree tree, Object value,boolean sel, boolean expanded, boolean leaf, int row,boolean hasFocus) {
    ImageIcon fold = new ImageIcon("../lib/file.png");
    DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
    //test si c'est une feuille
    if(leaf){
    //Peux tester le type d'objet sélectionné dans le Jtree
    if (node.getUserObject() instanceof type_de_classe) {
    //Permet de définir l'icone pour le type de classe trouvé...
    this.setLeafIcon(fold);
    }
    }
    //noeud avec enfants
    if(expanded){
    //Cas du noeud « ouvert »
    this.setOpenIcon(fold);
    }
    else{
    //Cas du noeud « fermé »
    this.setClosedIcon(fold);
    }
    //on appelle ensuite la classe de base
    super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf,row, hasFocus);
    return this;
    }
    }

    Ajout d'un noeud

    //Création du nouveau noeud
    DefaultMutableTreeNode node = new DefaultMutableTreeNode(Object);
    //Ajout du nouveau noeud au noeud parent
    node_parent.add(node);
    //Récupère le chemin complet vers ce nouveau noeud
    TreePath tp = new TreePath(node.getPath());
    //Met a jour l'arbre au niveau du noeud parent
    ( (DefaultTreeModel)jtree.getModel()).nodeStructureChanged( (TreeNode) node_courant);
    //On sélectionne par défaut le 'nouveau noeud'
    jtree.setSelectionPath(tp);

    Sélection d'un noeud

    //Récupère le chemin du noeud
    TreePath tp = new TreePath(noeud.getPath());
    //Sélection du noeud
    jtree.setSelectionPath(tp);
    //Dans le cas d'un Jtree qui est dans un JscrollPane, il faut régler l'ascenseur de manière a voir le noeud sélectionné
    jtree.scrollPathToVisible(tp);

    Suppression d'un noeud fils

    //Récupération de l'index du fils dans le père
    node_parent.getIndex(node);
    //Enlève le fils situé a l'index spécifié
    node_parent.remove(index);
    //Rafraichissement du noeud père
    ( (DefaultTreeModel)jtree.getModel()).nodeStructureChanged( (TreeNode) node_parent);

    Suppression de tous les enfants d'un noeud

    node_parent.removeAllChildren();
    ( (DefaultTreeModel)jtree.getModel()).nodeStructureChanged( (TreeNode) node_parent);

    Suppression d'un fils sans spécifier son « père »

    //Cette méthode permet de supprimer toute l'arborescence contenue dans le fils...
    node_fils.removeFromParent();
    ( (DefaultTreeModel)this.get_JTree().getModel()).nodeStructureChanged( (TreeNode) node_fils);

    Mise a jour du contenu d'un noeud (objet contenu dans le noeud)

    node_courant.setUserObject(Object);
    ( (DefaultTreeModel)this.get_JTree().getModel()).nodeStructureChanged( (TreeNode) node_courant);

    Gestion du collapse/expand

    TreePath tp = new TreePath(node_courant.getPath());
    boolean bool = jtree.isCollapsed(tp);
    if (!bool) {
    jtree.expandPath(tp);
    }

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 18
    Par défaut
    j'avais déja vu ça, mais merci quand meme.

    Mon probleme est que le premier clic sert à selectionner
    le noeud, puis les clics suivant vont sur mes evenements.
    J'aimerai donc :
    -soit pouvoir forwarder l'event depuis le JTree MouseListener
    -soit supprimer la selection
    -soit sélectionner toutes les nodes dès le début, comme ca pu de pb.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 167
    Par défaut
    Peut être qu'en utilisant ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    jtree.addMouseMotionListener(new MouseMotionAdapter() {
    public void mouseMoved(MouseEvent e) {
    //Récupère le chemin du noeud survolé en fonction des coordonnées de la souris
    TreePath selPath = jtree.getPathForLocation(e.getX(), e.getY());
    if (selPath != null) {
    //A partir du chemin, on récupère le noeud
    DefaultMutableTreeNode node = (DefaultMutableTreeNode) selPath.getLastPathComponent();
    if ((node != null) && (!node.isRoot())) {
    //action a faire
    }
    }
    }
    });
    Ca me sert a faire des roll over...
    mais dans ton cas, ca peux te permettre de récupérer un noeud sans avoir a le selectionner avant...en suite il suffit d'écouter les événement de clic...

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 33
    Par défaut incompréhension d'une ligne
    Bonjour dans le code que Tomca nous a filé à partir du site How to sur les Jtree jai pas compris cette ligne :
    DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;

    c'est en fait surtout la parti après le = que j'ai pas compris ce que cela signifiait. est ce que c'est bien on attribue la valeur 'value' à l'objet DefaultMutableTreeNode?


    merci de vos reponses

  10. #10
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    On attribue la valeur de value à node, mais pour faire cela, comme ils ne sont pas de la meme classe, il faut transtyper value; c'est à ça que sert (DefaultMutableTreeNode).

Discussions similaires

  1. [Swing]JTable- Dimensionner les colonnes
    Par loutfi dans le forum Composants
    Réponses: 12
    Dernier message: 01/07/2011, 08h50
  2. swing et jbuilder
    Par lassale dans le forum JBuilder
    Réponses: 3
    Dernier message: 31/10/2003, 19h28
  3. [swing] probleme de memoire
    Par leBigouden dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 23/05/2003, 14h19
  4. [SWING]jTable + Focus
    Par chady dans le forum Composants
    Réponses: 5
    Dernier message: 27/02/2003, 14h51
  5. [SWING][FONT] choisir la police par défaut
    Par narmataru dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 21/02/2003, 10h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo