2012-08-14 73 views
1

我试图使用this package来对商店的类别执行CRUD操作。我不知道在哪里找到使用这个软件包的经验的人,所以我决定在这里问。JPersistentTree(JTree,boundtree)将路径扩展到给定节点

我想添加一个快速搜索选项,用户可以在不浏览树的情况下搜索类别,并在JTree上展开选定的路径和节点。

到目前为止,我已经做了以下内容:

ArrayList<FpsInventoryCategory> path; 

    // recursive method to find the path to the root of a selected node 
    private void findTreePath(FpsInventoryCategory currentNode) throws StorageException{ 
     Object parentId = currentNode.getParentId(); 
     FpsInventoryCategory parentNode = (FpsInventoryCategory) store.getItem(parentId); 
     if (parentNode.isRoot()){ 
      path.add(0, parentNode); 
     } else { 
      path.add(0, parentNode); 
      findTreePath(parentNode); 
     } 

    } 

FpsInventoryCategory实现HierarchialItem。 path是FpsInventoryCategory的ArrayList。这很好,我可以得到所需的路径。

我遇到的问题是了解该软件包以确定如何扩展节点和/或TreePath。我原本是通过TreePath尝试的,但后来才意识到,由于JPersistentTree的整个构想是动态加载数据,所以JTree将不会有数据通过第一行儿童。这是一个正确的假设吗?

如果是这样,那么我假设我已经加载孩子一起这是我试过的路径如下:

private void viewTreeNodeAndPath(Long id2) throws StorageException { 
     // TODO Auto-generated method stub 
gui.getTreeInventoryCategory().getModel().getRoot(); 
      path = new ArrayList<FpsInventoryCategory>(); 
      store = gui.getStore(); 
      FpsInventoryCategory startNode = (FpsInventoryCategory) store.getItem(id); 
      path.add(startNode); 
      findTreePath(startNode); 
      DynamicTreeNode currentTreeNode; 
      Iterator it = path.iterator(); 
      int i = 0; 
      FpsInventoryCategory temp; 
      while(it.hasNext()){ 
       temp = (FpsInventoryCategory) it.next(); 
       System.out.println("temp cat:" + temp.getName()); 
       currentTreeNode = new DynamicTreeNode(store, temp); 
       currentTreeNode.loadChildren(); 
       gui.getTreeInventoryCategory().expandRow(i); 
       i++; 
      } 

//  selectedTreePath = new TreePath(dynamicNodePath); 
//  System.out.println(selectedTreePath); 
//  gui.getTreeInventoryCategory().setSelectionPath(selectedTreePath); 
//  
//  gui.getTreeInventoryCategory().expandPath(selectedTreePath); 

    } 

^由路径注释掉的选择,因为它并没有产生效果。这同样不起作用。

任何想法如何让树扩大?甚至在哪里我可以得到关于此事的更多信息?

请随时通知我或让我知道我在哪里可以找到解决方案。

此致敬礼。

+0

嗨mKorbel,我似乎无法知道/记得你编辑过的东西。我正在研究一种解决方案,它需要从根到遍历JPersistenttree遍历搜索节点,扩展路径中的所有节点。似乎没有效率,但我似乎无法通过路径扩展JPersistentTree。我会在今天晚些时候发布答案。 – greatkalu 2012-08-15 07:41:49

回答

1

好的...让它工作。这是代码。在编码之间做了一些其他的事情,所以可能会留下一两件事。

我会首先提到关键字段(全局变量),然后指出相关的方法。这是来自控制器,MVC模式。

private FpsInventoryCategoryTreeAdapter store; 
    ArrayList<FpsInventoryCategory> path; 
    TreePath selectedTreePath; 
    private Long id; 

// expand path and select node in JPersistentTree of category being searched 
    private void viewTreeNodeAndPath() throws StorageException { 
     // TODO Auto-generated method stub 
     path = new ArrayList<FpsInventoryCategory>(); 
     store = gui.getStore(); // get store from gui (view contains HierarchicalDataStore implementation for JPersistentTree) 
     FpsInventoryCategory startNode = (FpsInventoryCategory) store.getItem(id); // id is the selected node as per quick search 
     path.add(startNode); // add selected node to path 
     // find path from root to selected node 
     findTreePath(startNode); 
     int pathLength = path.size(); 
     TreeModel model = gui.getTreeInventoryCategory().getModel(); 
     DynamicTreeNode rootNode = (DynamicTreeNode) model.getRoot(); 
     // traverse through JPersistentTree from root to searched node, returning path to selectedTreePath 
     searchThroughTree(model, rootNode, pathLength, 1); 
     // expand selectedTreePath (from root to searched node) 
     gui.getTreeInventoryCategory().setSelectionPath(selectedTreePath); 
     gui.getTreeInventoryCategory().scrollPathToVisible(selectedTreePath); 
    } 

    // recursive method to find the path to the root of a selected node 
    private void findTreePath(FpsInventoryCategory currentNode) throws StorageException{ 
     Object parentId = currentNode.getParentId(); 
     FpsInventoryCategory parentNode = (FpsInventoryCategory) store.getItem(parentId); 
     if (parentNode.isRoot()){ 
      path.add(0, parentNode); 
     } else { 
      path.add(0, parentNode); 
      findTreePath(parentNode); 
     } 

    } 

    // recusrive method to get TreePath of searched node 
    // pathSize: number of nodes from root to searched path 
    // pathPosition: index of current node in path 
    private void searchThroughTree(TreeModel model, DynamicTreeNode rootNode, int pathSize, int pathPosition){ 
     int childCount = model.getChildCount(rootNode); 
     for (int i = 0; i < childCount; i++){ 
      DynamicTreeNode childNode = (DynamicTreeNode) model.getChild(rootNode, i); 
      if (model.isLeaf(childNode)){ 
       if (path.get(pathPosition).getId() == childNode.getUserObject().getId()){ 
        selectedTreePath = getPath(childNode); 
        break; 
       } 
      } else { 
       if (path.get(pathPosition).getId() == childNode.getUserObject().getId()){ 
        if (pathPosition + 1 == pathSize){ 
         selectedTreePath = getPath(childNode); 
         break; 
        } else { 
         pathPosition = pathPosition + 1; 
         searchThroughTree(model, childNode, pathSize, pathPosition); 
        } 
       } 
      } 
     } 
    } 

    // find path from root to node 
    public TreePath getPath(DynamicTreeNode node){ 
     List list = new ArrayList(); 
     // Add all nodes to list 
     while (node != null){ 
      list.add(node); 
      node = (DynamicTreeNode) node.getParent(); 
     } 
     Collections.reverse(list); 
     // Convert array of DynamicTreeNodes to TreePath 
     return new TreePath(list.toArray()); 
    } 

在我的机器上正常工作。