2013-07-30 1 views
0

전에 나쁜 영어로 유감스럽게 생각하며 이해할 수없는 것이 있으면 알려주세요.JTree에서 속성의 참조가 모두 변경됩니다.

2 Jtree 있습니다. 각 나무는 분명히 같은 정보를 가지고 있습니다. 변경되는 유일한 점은 각 노드가있는 속성의 이름입니다.

예 : JTree1에는 ID와 ParentID가 있습니다. 이러한 속성에는 이름과 값이 있습니다. 이름 : ID_Tree1. 값 : TESTID1// 이름 : ParentID_Tree1. 값 : TESTPID1 JTree2에는 JTree1과 같은 값이 있지만 이름은 다릅니다.

노드를 생성하기 위해 JTree1에서 JTree2로 노드를 전송하는 순간이 있습니다. 전송/생성은 정확하지만 노드를 읽을 때 다른 속성 이름 아키텍처 (Jtree1 arch.)가 있으며 JTree2 아키텍처가 필요하기 때문에 읽을 수 없습니다. 올바른 이름으로 이름을 변경하고 JTree2에 대해 이해할 수 있기 때문에 문제를 해결하기 위해 changeAttributesNamesFromDOORSToTC() 함수가 있습니다.

실제 문제 : 함수가 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

자바에서 객체 할당은 실제로 참조 사본입니다. NodeClass 인스턴스 것을 라인 평균 실제로 가변 actualNode가 NodeClass 인스턴스 아니기 때문에, "오브젝트 newActualNode에 오브젝트 actualNode의 값을 넣어"않는

NodeClass newActualNode = actualNode;

하지만 참조. 따라서 NodeClass newActualNode = actualNode;을 수행하면 참조가 복사되므로 두 변수가 모두 동일한 인스턴스를 효과적으로 가리 킵니다.

그런 다음 다른 하나도 없기 때문에 하나의 "other"속성 이름도 변경하면 메모리에 같은 장소가됩니다.

이제 NodeClass의 새 인스턴스를 원하는 값으로 생성해야합니다.이렇게하려면 몇 가지 방법이 있습니다. 내부 구조를 모르기 때문에 더 적합한 방법을 알기는 어렵지만 결국에는 다음을 수행해야합니다.

  • 새 NodeClass 인스턴스를

    012 다음 newActualNode

그래서 newActualNode에서 원하는 속성 이름을 지정에 actualNode의 newActualNode 변수

  • 넣어 값 (필드),이 같은 수

    또는 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이 제대로 계산되지 않습니다 , 특히 treeTCCode 중 하나가 아닌 treeDOORSCode의 부모 노드를 가져 오는 것입니다.

  • +0

    해답을 주셔서 감사합니다. 그러나 정확하지 않습니다. 너는 내가 의미하고 필요로하는 것을 이해했다. DefaultMutableTreeNode를 복제 할 방법이 필요하지만 복제자를 가리 키지 않으려합니다. 그것은 어리석은 질문이지만 미쳐지기 시작했습니다 ... – chiri4

    +0

    "나는 DefaultMutableTreeNode를 복제하는 방법이 필요하지만 그것을 복제자를 가리 키지는 않겠습니다"라고 바꿀 수 있습니까? – DSquare

    +0

    동일한 DefaultMutableTreeNode (동일한 속성 및 특성 사용)를 만들고 싶지만 한 속성을 변경하려면 변경 내용이 기본으로 복제되는 것을 원하지 않습니다. 2 개의 DefaultmutableTreeNode 오브젝트의 링크를 해제합니다. 이해하니? – chiri4

    관련 문제