2014-04-29 23 views
1

我有我可以過濾的JXTreeTable。當我篩選關鍵字時,會設置新模型。它適合我。JXTreeTable過濾後的expandPath

現在我想展開所有過濾的結果。爲此,我保存找到匹配節點的位置。 (它不能是葉。)

對於定位我創建這個方法的TreePaths的列表:

public TreePath getPath(TreeNode node) { 
    List<TreeNode> list = new ArrayList<TreeNode>(); 

    while (node != null) { 
     list.add(node); 
     node = node.getParent(); 
    } 
    Collections.reverse(list); 

    return new TreePath(list.toArray()); 
} 

現在我遍歷這個列表,並調用expandPath(新的模式設置後) getTreePaths()是我用之前的方法創建的TreePath的列表。

for (TreePath elem : f.getTreePaths()) { 
     tree.expandPath(elem); 
     tree.scrollPathToVisible(elem); 
} 

但它沒有效果,只有根擴展,所有的孩子都崩潰了。 在TreePath中,最後一個元素是沒有葉子的。在此循環中的System.out我得到了所有:

-1 真正 真正 真正

的System.out.println(tree.getRowForPath(ELEM));的System.out.println(f.isPathValid(ELEM,tree.getTreeTableModel())); System.out.println(tree.isVisible(elem)); System.out.println(tree.isExpanded(elem));

getRowForPath的-1可能是問題?

isPathValid():

public boolean isPathValid(TreePath path,TreeTableModel model) { 
    if (path.getPathCount() == 0) { 
     return model.getRoot().equals(path.getPathComponent(0)); 
    } 

    for (int x = 1; x < path.getPathCount(); x++) { 
     if (model.getIndexOfChild(path.getPathComponent(x - 1), 
       path.getPathComponent(x)) == -1) { 
      return false; 
     } 
    } 
    return true; 
} 

回答

1

我知道這是舊的文章,但我會在一個類似的問題花費一個小時後,這裏將我的發現。

方法「isPathValid」僅通過檢查子級(x)是否屬於父級(x-1)來驗證序列是否正確,但是如果根與表模型相同則不驗證(除非路徑計數爲零)。

過濾時,通常會觸發表格模型的新根,因此如果您在更新模型(並觸發新根)之前「捕獲」TreePath,表格將無法找到路徑,儘管路徑本身是有效的。

應該有一些變化的工作:

public **List** getPath(TreeNode node) { 
List<TreeNode> list = new ArrayList<TreeNode>(); 

**while (node != model.getRoot()) {** 
    list.add(node); 
    node = node.getParent(); 
} 
    Collections.reverse(list); 

    **return list;** 
} 

**for (List elem : f.getTreePaths()) {** 
     elem.add(0, model.getRoot()); 
     tree.expandPath(new TreePath(elem.toArray()); 
     tree.scrollPathToVisible(elem); 
}