获取 JTree 节点的正确行位置
Getting the correct row position of JTree nodes
我正在使用 Java 的 swing 的 JTree,需要在其路径中找到 selected 节点的适当行索引。比如下图中我selectPolygon 2
,
-并使用这段代码,
tree.getRowForPath(/*path of polygon node*/);
-我得到值2
,这是正确的。但是,当我 select Polygon 3
时,我得到的值是 6
。这是因为在找到合适的节点时,它会将 Polygon 2
展开的节点进行计数。我不想要这个,因为当 Polygon 3
被 selected 时,我需要 return 值 3,无论之前的节点是否扩展。
我想遍历所有节点,找出哪些节点在 selected 的行索引之前,看看它们是否展开,并计算它们包含多少个节点。然后将其添加到根据上述方法编辑的 return 行。
问题是我不知道如何处理这个问题。我有一些尝试过的意大利面条代码,但我怀疑它是否有用。
感谢任何帮助。
这是一个例子,你想要什么(如果我正确理解你的问题),但@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;
}
我最终根据@MadProgrammer 在他的评论中的建议编写了一个解决方案。我像这样创建了一个树节点 class:
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 的,而无需遍历每个节点并消除扩展节点。
我正在使用 Java 的 swing 的 JTree,需要在其路径中找到 selected 节点的适当行索引。比如下图中我selectPolygon 2
,
-并使用这段代码,
tree.getRowForPath(/*path of polygon node*/);
-我得到值2
,这是正确的。但是,当我 select Polygon 3
时,我得到的值是 6
。这是因为在找到合适的节点时,它会将 Polygon 2
展开的节点进行计数。我不想要这个,因为当 Polygon 3
被 selected 时,我需要 return 值 3,无论之前的节点是否扩展。
我想遍历所有节点,找出哪些节点在 selected 的行索引之前,看看它们是否展开,并计算它们包含多少个节点。然后将其添加到根据上述方法编辑的 return 行。
问题是我不知道如何处理这个问题。我有一些尝试过的意大利面条代码,但我怀疑它是否有用。
感谢任何帮助。
这是一个例子,你想要什么(如果我正确理解你的问题),但@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;
}
我最终根据@MadProgrammer 在他的评论中的建议编写了一个解决方案。我像这样创建了一个树节点 class:
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 的,而无需遍历每个节点并消除扩展节点。