2013-07-30 64 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