2014-10-28 6 views
0

스윙 컨트롤을 사용하여 JTree을 만들고 treeWorld이라는 이름을 만들었습니다. 루트 노드는 뿌리와 아이들, 즉 포유류, 새, 파충류, 양서류, 곤충입니다. 이제 새들에게 참새, 뻐꾸기를 프로그래밍 방식으로 추가하고 싶습니다.JTree의 부모 노드에 자식 노드 추가

하지만 참새, 뻐꾸기를 새에 추가 할 수는 없습니다.

이 코드의 내 조각 조각 : 당신이 전체 실행 가능한 예제를 게시하지 않았기 때문에 잘 모르겠어요,하지만 난 당신이 단순히 모델을 업데이트해야, 생각

DefaultTreeModel model = (DefaultTreeModel)treeWorld.getModel(); 

DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot(); 

DefaultMutableTreeNode bird = new DefaultMutableTreeNode("Birds"); 
DefaultMutableTreeNode sparrow = new DefaultMutableTreeNode("sparrow"); 

DefaultMutableTreeNode cuckoo = new DefaultMutableTreeNode("cuckoo"); 
bird.add(sparrow); 
bird.add(cuckoo); 
this.pack(); 
this.setVisible(true); 
+1

더 도움이 빨리 들어, [MCVE] (http://stackoverflow.com/help/mcve) (최소 완전하고 검증 가능 예)를 게시 할 수 있습니다. –

+0

각하, MCVE를 게시하는 방법 – ddk

+0

"하지만 새들에게 참새, 뻐꾸기를 추가 할 수는 없습니다." - 그게 뭐야? – RobAu

답변

1

는 결코 root.add(bird);를 사용하십시오 JTreebird 노드를 추가하지 문제를 보인다.

루트 노드에 이미 새 노드가 포함되어있는 경우 해당 노드를 root에서 검색하고 새 노드를 만들지 않아야합니다.

표시되는 트리에 새 노드를 추가하는 경우 model.nodesWereInserted(NODE, new int[]NODE.getChildCount()-1});도 사용하십시오. NODE - 새 하위를 추가하는 노드입니다.

예 :

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Enumeration; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JTree; 
import javax.swing.tree.DefaultMutableTreeNode; 
import javax.swing.tree.DefaultTreeModel; 

public class TestFrame extends JFrame { 

    private JTree t; 

    public TestFrame() { 
     init(); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     pack(); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    private void init() { 

     DefaultMutableTreeNode root = new DefaultMutableTreeNode("root"); 
     DefaultMutableTreeNode bird = new DefaultMutableTreeNode("Birds"); 
     root.add(bird); 

     DefaultTreeModel model = new DefaultTreeModel(root); 
     add(t=new JTree(model)); 

     JButton btn = new JButton("add"); 
     btn.addActionListener(getAddListener()); 

     add(btn,BorderLayout.SOUTH); 
    } 

    private ActionListener getAddListener() { 
     return new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       DefaultTreeModel model = (DefaultTreeModel)t.getModel(); 
       DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot(); 

       Enumeration children = root.children(); 
       while(children.hasMoreElements()){ 
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) children.nextElement(); 
        if(node.toString().equals("Birds")){ 

         DefaultMutableTreeNode sparrow = new DefaultMutableTreeNode("sparrow"); 
         DefaultMutableTreeNode cuckoo = new DefaultMutableTreeNode("cuckoo"); 

         node.add(sparrow); 
         node.add(cuckoo); 
         model.nodesWereInserted(node, new int[]{node.getChildCount()-1,node.getChildCount()-2}); 
         break; 
        } 
       } 


      } 
     }; 
    } 

    public static void main(String args[]) { 
     new TestFrame(); 
    } 

} 
+0

root.add (bird)를 추가 할 때 작업했습니다. – ddk

-1

.

bird.add(sparrow); 
bird.add(cuckoo); 
model.reload(); // your model and tree don't know that you've added some nodes. 
this.pack(); 
this.setVisible(true); 
+0

작동하지 않습니다 – ddk

+0

@ddk 실행 가능한 예제를 제공하십시오. –

관련 문제