2017-01-10 87 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; 
}