2014-10-28 94 views
0

我使用Swing控件創建了一個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)(最小完備可驗證實施例)。 – 2014-10-28 10:30:33

+0

先生,如何發佈一個MCVE – ddk 2014-10-28 10:34:14

+0

「但我不能添加麻雀,布穀鳥。」 - 什麼是錯誤? – RobAu 2014-10-28 10:34:31

回答

1

似乎問題,你永遠不添加bird節點到您的JTree,使用root.add(bird);

如果您的根節點已經包含鳥節點,您需要在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(鳥); – ddk 2014-10-28 11:13:29

-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 2014-10-28 10:46:16

+0

@ddk所以請提供一個可運行的示例。 – 2014-10-28 11:04:55