2012-04-20 2 views
8

Ich habe eine JTree und eine awt.Canvas. Wenn ich mehrere Objekte aus der Canvas in objList auswähle, möchte ich alle ausgewählten Elemente innerhalb der JTree wie ausgewählt angezeigt. Das bedeutet zum Beispiel, wenn ich 2 Objekte ausgewählt habe, sollten beide ihre Pfade zu root erweitert werden, und auch jedes ausgewählte Objekt sollte seine entsprechenden TreeNode ausgewählt haben. Mein JTree hat TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION. HierJava: Wie programmgesteuert mehrere Knoten in einem JTree auswählen und erweitern?

ist eine Probe des funcion erweitern i verwenden:

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; 
} 

In meinem aktuellen Zustand, wenn ich ein einzelnes Objekt auswählen, wird es in den JTree ausgewählt werden und seine TreePath wird angezeigt. Aber wenn entities mehr als 1 Objekt ausgewählt hat, wird nichts angezeigt, mein JTree bleibt unverändert.

+0

* "Ich habe eine' JTree' und eine 'awt.Canvas'." * Mischen Sie nicht Swing mit AWT-Komponenten. Das 'Canvas' sollte ein' JPanel' sein oder ein Bild, das in 'JLabel' angezeigt wird. –

+0

Ich weiß, dass ich das normalerweise nicht tun sollte (ich habe einige Probleme damit, dass das Hauptmenü hinter der Zeichenfläche expandiert), aber in diesem Fall ist die einzige Verbindung zwischen ihnen das Array von Elementen aus der Zeichenfläche, die in der Struktur dargestellt werden. Und in der GUI gibt es etwas Platz zwischen ihnen, also ist kein Schaden angerichtet/ –

Antwort

14

Sie suchen nach dem TreeSelectionModel der JTree (verwenden Sie den Getter). Verwenden Sie die TreeSelectionModel#setSelectionPaths für mehrere Pfade. Jetzt stellen Sie nur einen Knoten ein, der aufgrund Ihres Anrufs tree.setSelectionPath(tpath); ausgewählt wurde. Die TreeSelectionModel hat auch Methoden zum Hinzufügen/Entfernen zu einer vorhandenen Auswahl, ... (im Grunde alles, was Sie in Zukunft brauchen könnten).

Eine interessante Methode für die Erweiterung ist die JTree#setExpandsSelectedPaths-Methode, die es ermöglicht, die JTree so zu konfigurieren, dass ausgewählte Pfade automatisch erweitert werden. Wenn Sie dies manuell verwalten möchten, können Sie die JTree#setExpandedState Methode verwenden

+0

Danke. Ich war monatelang dran. – nslntmnx

Verwandte Themen