获取 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 的,而无需遍历每个节点并消除扩展节点。