我正在使用Java的swing的JTree,并且需要在其路径中找到所选节点的相应行索引。例如,当我在下面的图片中选择Polygon 2
时,
- 并使用这段代码,
tree.getRowForPath(/*path of polygon node*/);
- 我得到的值2
,这是正确的。但是,当我选择Polygon 3
时,我会得到值6
。这是因为在找到适当的节点时,Polygon 2
扩展的节点需要计数。我不想要这个,因为我需要在选择Polygon 3
时返回值3,无论是否有任何节点或者先前的节点被扩展。
我想到循环遍历所有节点,找到哪些节点位于所选节点的行索引之前,查看它们是否已展开,并计算它们包含的节点数。然后将其添加到从上面的方法返回的行。
问题是我不知道如何处理这个问题。我有一些尝试过的意大利面条代码,但我怀疑它是否有用。
感谢任何帮助。
答案 0 :(得分:1)
这是一个例子,你想要什么(如果我正确理解你的问题),但@MadProgrammer的解决方案是首选方式。
public static int indexInParentForPath(JTree aTree, TreePath path) {
Object p = null;
Object parent = null;
for (int i = 0; i < path.getPathCount(); i++) {
if (path.getPathComponent(i).toString().contains("Polygon")) {
p = path.getPathComponent(i);
parent = i > 0 ? path.getPathComponent(i - 1) : null;
break;
}
}
if (p != null) {
return parent == null ? 0 : aTree.getModel().getIndexOfChild(parent, p);
}
return -1;
}
答案 1 :(得分:1)
我最终在他的评论中根据@MadProgrammer的建议编写了一个解决方案。我创建了一个树节点类,如下所示:
public class CustomTreeNode extends DefaultMutableTreeNode {
private int position;
public CustomTreeNode(String text, int position){
super(text);
this.position = position;
}
public int getPosition(){
return this.position;
}
}
这允许我保存我想要的任何对象的索引,无论名称如何(引用@Sergiy Medvynskyy也是有用的解决方案)。
我初始化了这样的对象(这是for循环):
//root node
CustomTreeNode polygon = new CustomTreeNode("Polygon " + (i+1), i);
我使用了这样的节点:
@Override
public void valueChanged(TreeSelectionEvent e) {
TreePath[] selectedPaths = tree.getSelectionPaths();
TreePath parentPath = tree.getClosestPathForLocation(1, 1);
if (selectedPaths == null)
return;
ArrayList<Integer> validRows = new ArrayList<>();
for (TreePath tp : selectedPaths){
if (tp.getParentPath() != parentPath)
continue;
//get node that current selected path points too, then get the custom index of that
CustomTreeNode selectedNode = (CustomTreeNode) tp.getLastPathComponent();
System.out.println(selectedNode.getPosition());
validRows.add(selectedNode.getPosition());
}
注意我是如何在不迭代每个节点并消除扩展节点的情况下轻松填充ArrayList validRows的。