2013-07-30 69 views
0

在此之前,我很抱歉我的英語不好,並告訴我是否有任何不可理解的內容。JTree中的屬性更改

我有2個Jtree。每棵樹顯然具有相同的信息。它們中唯一改變的是具有每個節點的屬性的名稱。

例如 JTree1具有一個ID和一個PARENTID。這些屬性具有名稱和價值。名稱:ID_Tree1。值:TESTID1 //名稱:ParentID_Tree1。值:TESTPID1 JTree2中的值與JTree1中的值相同,但名稱不同。

有一個在我從JTree1轉移節點JTree2去創造一個時刻。傳輸/創建是正確的,但是當我讀取節點時,它具有不同的屬性名稱體系結構(Jtree1 arch。),並且因爲需要具有JTree2體系結構而無法讀取。我有函數changeAttributesNamesFromDOORSToTC()來解決問題,因爲它只是將名稱更改爲正確的名稱並且可以理解爲JTree2

真正的問題:該函數在JTree2的節點中進行更改,但同時它發生更改JTree1中同一節點的值名稱。它使參考數據,而不是我認爲的任務。

我該如何解決這個問題!?

謝謝!

JTree treeDOORSCode; //JTree1 
JTree treeTCCode; //JTree2 

主要代碼:

//ACTUAL NODE 
DefaultMutableTreeNode selectedTreeNode = (DefaultMutableTreeNode) CurrentSelection.getLastPathComponent(); 
NodeClass actualNode = (NodeClass)selectedTreeNode.getUserObject(); 


//ACTUAL PARENT NODE 
DefaultMutableTreeNode selectedParentTreeNode = (DefaultMutableTreeNode)  selectedTreeNode.getParent(); 
NodeClass parentNode = (NodeClass) selectedParentTreeNode.getUserObject(); 
DefaultMutableTreeNode parent = findNode(NodeClass.getNodeParentIdentifierAttrDOORS(parentNode), treeTCCode); 


//NEW NODE 
DefaultMutableTreeNode newSelectedTreeNode = selectedTreeNode; 

//NEW PART 
NodeClass newNode = new NodeClass(); 
     newNode = insertNodeInfo(actualNode); 

//Create the Model and insert the node 
DefaultTreeModel treeModelTC = (DefaultTreeModel)treeTCCode.getModel(); 
treeModelTC.insertNodeInto(newSelectedTreeNode, parent, 0); 

//NEW PART 
newNode .changeAttributesNamesFromDOORSToTC(); 
newSelectedTreeNode.setUserObject(newNode); 

該函數改變ATTR名稱值:

public void changeAttributesNamesFromDOORSToTC(){ 

    for (int i = 0; i < this.attributes.size(); i++) { 
     if (this.attributes.get(i).attributeName.equals(DOORS_ID)){ 
      if (this.tag.equals(TYPE_NAME_CASE)){ 
       this.attributes.get(i).attributeName = TC_IDCASE; 
      } 
      if (this.tag.equals(TYPE_NAME_FOLDER)){ 
       this.attributes.get(i).attributeName = TC_IDFOLDER; 
      } 
      if (this.tag.equals(TYPE_NAME_FEATURE)){ 
       this.attributes.get(i).attributeName = TC_IDFEATURE; 
      } 
     } 
     if (this.attributes.get(i).attributeName.equals(DOORS_PARENTID)){ 
      this.attributes.get(i).attributeName = TC_PARENTID; 
     } 
     if (this.attributes.get(i).attributeName.equals(DOORS_SRS)){ 
      this.attributes.get(i).attributeName = TC_SRS; 
     } 

    } 
} 

屬性類:

NodeAttributesClass (String attributeName, String attributeValue) 
{ 
    this.attributeName = attributeName; 
    this.attributeValue = attributeValue; 
} 

讓我知道,如果需要更多的信息!

+1

更快地發佈[SSCCE](http://sscce.org/),簡短,可運行,可編譯,幾乎是問題,具有TreeModel的硬編碼值, – mKorbel

+0

您可能可以使用任何一種方法[這裏](http://stackoverflow.com/a/11113648/230513)。 – trashgod

回答

0

java中的對象分配實際上是一個參考副本。

NodeClass newActualNode = actualNode;

這條線並不意味着「把對象actualNode的值轉換成目標newActualNode」,因爲實際上變量actualNode不是結點類別的實例,但參考到結點類別的一個實例。所以當你做NodeClass newActualNode = actualNode;時,你正在複製引用,現在這兩個變量都有效地指向同一個實例。

然後,當你在一個改變屬性名稱「他人」也隨之變化,因爲沒有這樣的其他,它在內存中的同一個地方。現在

,你需要做的是建立結點類別的新實例與你想要的值。有幾種方法可以做到這一點,這是我很難知道至極一個更適合,因爲我不知道內部結構,但最終你需要:

  • 創建了一個新的結點類別實例newActualNode可變
  • 把actualNode的值(場)進入newActualNode
  • 指定您在newActualNode

所以想要的屬性名稱,也可能是這樣的:

NodeClass newActualNode = new NodeClass(actualNode); //copy constructor NodeClass(NodeClass anotherNode); 
newActualNode.changeAttributesNamesFromDOORSToTC(); //assuming the constructor doesn't put them right 

或者你可以在NodeClass的構造者中使用一個標誌來表示你想要的屬性名稱。

和拷貝構造函數應該是這樣的:

public NodeClass(NodeClass anotherNode) 
{ 
    this(anotherNode.someFields); //call to your "normal" constructor, with whatever params you need 

    //copy the values into the new instance this, if you didn't do it in the above line 
    this.field1 = anotherNode.field1; 
    this.field2 = anotherNode.field2; 
    //... 
    this.fieldn = anotherNode.fieldn; 
} 

你可以利用這個代碼用一粒鹽,有幾種方法可以做到這一點,差別細微如果有的話。重要的是你需要爲另一棵樹有另一個實例。

編輯

如果不工作,我的猜測是,要麼你需要插入之前做newSelectedTreeNode.setUserObject(newNode);,像這樣:

NodeClass newNode = new NodeClass(); 
newNode = insertNodeInfo(actualNode); 
newNode.changeAttributesNamesFromDOORSToTC(); 
DefaultMutableTreeNode newSelectedTreeNode = new DefaultMutableTreeNode(); 
newSelectedTreeNode.setUserObject(newNode); 
treeModelTC.insertNodeInto(newSelectedTreeNode, parent, 0); 

parent計算不正確特別是你正在獲取treeDOORSCode的父節點,而不是treeTCCode的父節點。

+0

謝謝你的答案,但它根本不正確。你明白我的意思和需要。我需要一種方法克隆DefaultMutableTreeNode,但我不希望它指向克隆。這是一個愚蠢的問題,但我開始變得瘋狂...... – chiri4

+0

你能改述「我需要一種方法克隆DefaultMutableTreeNode,但我不希望它指向克隆」? – DSquare

+0

我想創建相同的DefaultMutableTreeNode(具有相同的屬性和屬性),但如果我想更改一個屬性,我不希望更改複製到主。取消兩個DefaultmutableTreeNode對象的鏈接。你明白嗎? – chiri4