2009-11-18 2 views
0

Dans mon programme, j'ai 2 JTrees et il y a un écouteur commonelection commun pour les deux. Le problème se produit lorsque je sélectionne un nœud dans le premier arbre et que je sélectionne immédiatement un nœud dans le second arbre. Maintenant, si je devais revenir en arrière et sélectionner le même nœud dans le premier arbre sélectionné initialement, rien ne se passe. Comment puis-je résoudre ceci? Y at-il un moyen de désélectionner un nœud à la fin d'un gestionnaire d'événements valueChanged?Problème Java avec sélection d'arborescence

Après édition:

Maintenant, si je ne fais

 if (tree == tree1){ 

     if(!tree2.isSelectionEmpty()){ 

      tree2.clearSelection(); 

     } 

    } else { 

     if(!tree1.isSelectionEmpty()){ 

      tree1.clearSelection(); 
     } 

    } 

La première fois que je sélectionne l'arbre, il fonctionne très bien. Mais la deuxième fois, si je choisis un arbre différent, l'auditeur est renvoyé deux fois et je dois double-cliquer pour le sélectionner. Toute idée pourquoi?

Répondre

1

Swing n'effacera pas la sélection d'un JTree (ou JTable, JList, etc.) lorsqu'il perd le focus. Vous devez définir cette logique vous-même. Par conséquent, dans votre exemple, revenir en arrière et sélectionner le nœud dans le premier arbre n'a aucun effet car il est déjà sélectionné.

Voici un exemple d'implémentation TreeSelectionListener qui effacera la sélection d'un JTree lorsqu'une sélection est faite sur l'autre.

public static class SelectionMaintainer implements TreeSelectionListener { 
    private final JTree tree1; 
    private final JTree tree2; 

    private boolean changing; 

    public SelectionMaintainer(JTree tree1, JTree tree2) { 
    this.tree1 = tree1; 
    this.tree2 = tree2; 
    } 

    public valueChanged(TreeSelectionEvent e) { 
    // Use boolean flag to guard against infinite loop caused by performing 
    // a selection change in this method (resulting in another selection 
    // event being fired). 
    if (!changing) { 
     changing = true; 
     try { 
     if (e.getSource == tree1) { 
      tree2.clearSelection(); 
     } else { 
      tree1.clearSelection(); 
     } 
     } finally { 
     changing = false; 
     } 
    } 
    } 
} 
+1

Êtes-vous un robot? ... c'était vraiment rapide! – Thimmayya

+0

Son fonctionnement mais encore quand je passe d'un arbre à l'autre pour la sélection, je dois double-cliquer sur le nœud avant qu'il ne soit mis en évidence. (Bien que cliquer sur le nœud pour la première fois déclenche l'action que je recherche, il suffit que le nœud soit surligné après le deuxième clic). Est-ce le cours que votre code devrait prendre? – Goutham