2012-10-30 24 views

回答

0

为什么你需要克隆JTreeTreeModelJTree是视图,它显示任何后盾TreeModel代表。如果想要创建第二个相同的树,那么您需要复制/克隆树模型,并创建一个指向复制的TreeModel的新的JTree

1

正如@SteveKuo所说,你为什么需要克隆一个TreeModelTreeModel可以在JTree的不同实例之间共享。

下面是两个JTree共享相同模型的示例演示。或者,你可以创建两次相同TreeModel

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

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTree; 
import javax.swing.SwingUtilities; 
import javax.swing.Timer; 
import javax.swing.tree.DefaultMutableTreeNode; 
import javax.swing.tree.DefaultTreeModel; 

public class Test2JTree { 

    private void initUI() { 
     final JFrame frame = new JFrame(Test2JTree.class.getSimpleName()); 
     final DefaultTreeModel model = getTreeModel(); 
     final JTree tree1 = new JTree(model); 
     final JTree tree2 = new JTree(model); 
     frame.add(new JScrollPane(tree1), BorderLayout.WEST); 
     frame.add(new JScrollPane(tree2), BorderLayout.EAST); 
     frame.pack(); 
     frame.setSize(frame.getWidth() + 50, frame.getHeight() + 140); 
     frame.setVisible(true); 
     Timer t = new Timer(2000, new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot(); 
       root.add(new DefaultMutableTreeNode("A new node")); 
       model.nodesWereInserted(root, new int[] { root.getChildCount() - 1 }); 
       tree1.expandRow(0); 
       tree2.expandRow(0); 
       frame.revalidate(); 
      } 
     }); 
     t.start(); 
    } 

    private DefaultTreeModel getTreeModel() { 
     return new DefaultTreeModel(new DefaultMutableTreeNode("Root object")); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new Test2JTree().initUI(); 
      } 
     }); 
    } 
} 
+0

谢谢你的例子。问题是,它想要回收一棵老树并清除所有树叶,所以我只剩下文件夹。但是从共享模型中移除叶子也会更改原始树。所以我正在考虑一个简单的克隆作为这个简单的方法... – ghandi

+0

@ghandi你如何建立你的TreeModel在第一个地方?你可能有某种“工厂方法”,你可以再次调用并删除所有的“叶子”。 –

0

public IndigoMutableTreeNode cloneNode(IndigoMutableTreeNode node){ 
 
\t \t IndigoMutableTreeNode newNode = new IndigoMutableTreeNode(node.getUserObject()); 
 
     for(int iChildren=node.getChildCount(), i=0;i<iChildren; i++){ 
 
       newNode.add((IndigoMutableTreeNode)cloneNode((IndigoMutableTreeNode)node.getChildAt(i))); 
 
     } 
 
     return newNode; 
 
    }

只是通过根节点,并获得完整的不同根节点并把它传递给新树的新模式。