我最終在他的評論中寫了一個基於@ 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