[英]JPersistentTree (JTree, boundtree) expand path to given node
我正在嘗試使用此程序包對商店的類別實施CRUD操作。 我不知道在哪里可以找到有使用此軟件包的經驗的人,所以我決定在這里詢問。
我想添加一個快速搜索選項,用戶可以在其中搜索類別而無需瀏覽樹,並且在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);
}
^注釋了按路徑進行的選擇,因為它沒有產生結果。 這同樣是行不通的。
關於如何使樹擴展的任何想法? 甚至在哪里我可以得到更多關於這件事的信息?
請隨時給我建議或讓我知道在哪里可以找到解決方案。
最好的祝福。
好吧...讓它工作。 這是代碼。 在編碼之間正在做其他一些事情,因此可能遺漏一兩件事。
我將首先提到關鍵字段(全局變量),然后指出相關方法。 這是來自控制器的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());
}
在我的機器上工作正常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.