2012-04-20 88 views
8

我有一个JTree和一个awt.Canvas。当我从Canvas中选择多个对象到objList中时,我希望所选的所有项目都显示在选中的JTree之内。这意味着例如,如果我选择了2个对象,则它们的根路径都应该展开,并且每个选定的对象也应该选择其对应的TreeNode。我的JTree有TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTIONJava:如何以编程方式选择并扩展JTree中的多个节点?

这里是扩大funcion我使用的一个示例:

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组件混合使用。 'Canvas'应该是'JPanel'或者一个以'JLabel'显示的图像。 – 2012-04-20 10:03:32

+0

我知道我通常不应该这样做(我在扩展后的主菜单中存在一些问题),但在这种情况下,它们之间的唯一连接是来自画布中实体的数组,它们在树中表示。而在GUI中它们之间有一些空间,所以没有造成伤害/ – 2012-04-20 11:58:01

回答

14

您在找JTreeTreeSelectionModel(使用getter)。将TreeSelectionModel#setSelectionPaths用于多个路径。现在您只需设置一个节点,因为您的电话号码为tree.setSelectionPath(tpath);TreeSelectionModel也有方法添加/删除现有的选择,...(基本上你可能需要在未来)。

一个有趣的扩展方法是JTree#setExpandsSelectedPaths方法,它允许配置JTree自动扩展选定的路径。如果你想手动管理,你可以使用JTree#setExpandedState方法

+0

谢谢。我被困在这个数月之久。 – nslntmnx 2014-12-25 08:01:54