2012-04-20 5 views
8

У меня есть JTree и awt.Canvas. Когда я выбираю несколько объектов из Canvas в objList, я хочу, чтобы все выбранные элементы отображались внутри выбранного JTree. Это означает, например, если у меня выбрано 2 объекта, оба их пути к корню должны быть расширены, а также каждый выбранный объект должен иметь свой соответствующий TreeNode. У моего JTree есть TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION.Java: Как программно выбирать и расширять несколько узлов в JTree?

Вот образец расширения несильно я использую:

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

В моем текущем состоянии, если я выбираю один объект, то он будет выбран в JTree и его TreePath будет показан. Но если entities имеет более одного выбранного объекта, он ничего не отобразит, мой JTree останется без изменений.

+0

* «У меня есть« JTree »и« awt.Canvas ». * Не смешивайте Swing с компонентами AWT. «Холст» должен быть «JPanel» или изображением, отображаемым в «JLabel». –

+0

Я знаю, что я обычно не должен этого делать (у меня есть некоторые проблемы с главным меню, расширяющимся за холстом), но в этом случае единственное соединение между ними - это массив сущностей из холста, которые представлены в дереве. И в GUI есть некоторое пространство между ними, поэтому никакого вреда не делается/ –

ответ

14

Вы ищете TreeSelectionModel из JTree (используйте геттер). Используйте TreeSelectionModel#setSelectionPaths для нескольких путей. Теперь вы устанавливаете только один узел, выбранный из-за вашего вызова tree.setSelectionPath(tpath);. TreeSelectionModel также имеет методы добавления/удаления существующего выделения, ... (в основном все, что вам может понадобиться в будущем).

Интересным методом для расширения является метод JTree#setExpandsSelectedPaths, который позволяет настроить JTree для автоматического расширения выбранных маршрутов. Если вы хотите управлять этим вручную, вы можете использовать метод JTree#setExpandedState

+0

Спасибо. Я задерживался на этом несколько месяцев. – nslntmnx