2012-04-20 89 views
8

Tengo un JTree y un awt.Canvas. Cuando selecciono varios objetos dentro del Canvas en el objList, deseo que todos los elementos seleccionados se muestren dentro del JTree como seleccionado. Eso significa, por ejemplo, si tengo 2 objetos seleccionados, se deben expandir sus rutas a la raíz, y también cada objeto seleccionado debe tener su correspondiente TreeNode seleccionado. Mi JTree tiene TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION.Java: ¿Cómo seleccionar programáticamente y expandir múltiples nodos en un JTree?

Aquí es una muestra de la funcion ampliar yo uso:

public void selectTreeNodes() { 


    HashMap <String, MyEntity> entities = ...; 
    Iterator it = entities.keySet().iterator(); 
    while (it.hasNext()) { 

     String str = it.next().toString(); 
     MyEntity ent = entities.get(str); 

     if (ent.isSelected()) { 
      DefaultMutableTreeNode searchNode = searchNode(ent.getName()); 
      if (searchNode != null) { 

       TreeNode[] nodes = ((DefaultTreeModel) tree.getModel()).getPathToRoot(searchNode); 
       TreePath tpath = new TreePath(nodes); 
       tree.scrollPathToVisible(tpath); 
       tree.setSelectionPath(tpath); 
      } 
     } 
    } 
} 

public DefaultMutableTreeNode searchNode(String nodeStr) 
{ 
    DefaultMutableTreeNode node = null; 

    Enumeration enumeration= root.breadthFirstEnumeration(); 
    while(enumeration.hasMoreElements()) { 

     node = (DefaultMutableTreeNode)enumeration.nextElement(); 
     if(nodeStr.equals(node.getUserObject().toString())) { 

      return node;       
     } 
    } 

    //tree node with string node found return null 
    return null; 
} 

En mi estado actual, si selecciono un único objeto, se selecciona en el JTree y su TreePath se mostrará. Pero si entities tiene más de 1 objeto seleccionado, no mostrará nada, mi JTree se mantendrá sin cambios.

+0

* "Tengo un' JTree' y un 'awt.Canvas'." * No mezcle Swing con componentes AWT. El 'Canvas' debe ser un' JPanel' o una imagen mostrada en un 'JLabel'. –

+0

Sé que normalmente no debería hacer eso (tengo algunos problemas con el menú principal que se expande detrás del lienzo), pero en este caso la única conexión entre ellos es la matriz de entidades del lienzo que están representadas en el árbol. Y en la GUI hay espacio entre ellos, así que no se hace daño/ –

Respuesta

14

Está buscando el TreeSelectionModel del JTree (utilice el captador). Use el TreeSelectionModel#setSelectionPaths para múltiples rutas. Ahora solo está configurando un nodo seleccionado debido a su llamada tree.setSelectionPath(tpath);. El TreeSelectionModel también tiene métodos para agregar/eliminar a una selección existente, ... (básicamente todo lo que pueda necesitar en el futuro).

Un método interesante para la expansión es el método JTree#setExpandsSelectedPaths que permite configurar el JTree para expandir automáticamente rutas seleccionadas. Si desea administrarlo manualmente, puede usar el método JTree#setExpandedState

+0

Gracias. Estuve atrapado en esto por meses. – nslntmnx

Cuestiones relacionadas