我最终在他的评论中写了一个基于@ 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,无需遍历每个节点并消除扩展的节点。
我想问题是为什么?你试图达到什么目标要求你有'3'结果?从事物的声音,你可以得到没有问题的节点,为什么你需要行值?如果您使用的是类似'DefaultMutableTreeNode'的东西,则可以提供一个'userObject',它可以包含可能帮助您实现目标的其他信息 – MadProgrammer
@MadProgrammer如果用户添加或删除多边形,则此JTree具有更改的节点。我有一个单独的ArrayList包含多边形,并基于此,此JTree更新其列表,如果有更改的列表。如果我想在JTree中选择一个多边形,我需要知道该行,以便我可以建立与ArrayList的连接,并将我想要的任何内容更改为该多边形。我认为如果我有算法计算这个算法会更容易,而不是扩展'DefaultMutableTreeNode'。我可能是错的。 – Eric
我的首选解决方案是让'DefaultMutableTreeNode'管理'Polygon'或者对它可以更新的模型有一些参考,但那就是我:P ...基本上,你想尽量减少'JTree'和你现有的模型之间的凝聚力 – MadProgrammer