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
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
bonsoir,
cette information n'est pas disponible dans l'événement. Pour quelle raison en as tu besoin ?
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é
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
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?
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);
}
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.
Peut être qu'en utilisant ca :
Ca me sert a faire des roll over...
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 } } } });
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...
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
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).
Partager