获取JTree节点的正确行位置

时间:2017-01-10 06:53:06

标签: java swing jtree

我正在使用Java的swing的JTree,并且需要在其路径中找到所选节点的相应行索引。例如,当我在下面的图片中选择Polygon 2时,

enter image description here

- 并使用这段代码,

tree.getRowForPath(/*path of polygon node*/);

- 我得到的值2,这是正确的。但是,当我选择Polygon 3时,我会得到值6。这是因为在找到适当的节点时,Polygon 2扩展的节点需要计数。我不想要这个,因为我需要在选择Polygon 3时返回值3,无论是否有任何节点或者先前的节点被扩展。

我想到循环遍历所有节点,找到哪些节点位于所选节点的行索引之前,查看它们是否已展开,并计算它们包含的节点数。然后将其添加到从上面的方法返回的行。

问题是我不知道如何处理这个问题。我有一些尝试过的意大利面条代码,但我怀疑它是否有用。

感谢任何帮助。

2 个答案:

答案 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的。