2017-01-10 85 views
0

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

enter image description here

-and使用此代码段,

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

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

我想通过所有的节点,发现哪些是所选的行索引之前循环,看他们是否扩大,以及他们计算有多少节点包含的。然后将其添加到上述方法返回的行中。

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

任何帮助表示赞赏。

+0

我想问题是为什么?你试图达到什么目标要求你有'3'结果?从事物的声音,你可以得到没有问题的节点,为什么你需要行值?如果您使用的是类似'DefaultMutableTreeNode'的东西,则可以提供一个'userObject',它可以包含可能帮助您实现目标的其他信息 – MadProgrammer

+0

@MadProgrammer如果用户添加或删除多边形,则此JTree具有更改的节点。我有一个单独的ArrayList包含多边形,并基于此,此JTree更新其列表,如果有更改的列表。如果我想在JTree中选择一个多边形,我需要知道该行,以便我可以建立与ArrayList的连接,并将我想要的任何内容更改为该多边形。我认为如果我有算法计算这个算法会更容易,而不是扩展'DefaultMutableTreeNode'。我可能是错的。 – Eric

+0

我的首选解决方案是让'DefaultMutableTreeNode'管理'Polygon'或者对它可以更新的模型有一些参考,但那就是我:P ...基本上,你想尽量减少'JTree'和你现有的模型之间的凝聚力 – MadProgrammer

回答

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

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; 
}