How to construct a tree with 2 or other trees
Hi,
I want to create one tree with 2 trees like :
- first tree :
a
b--c
- second tree :
a
b
d
e
f--i--j
- the result is :
a
b--c
d
e
f--i--j
The first and second tree have the same frame (root). I create one tree when I select one node or one leaf on a tree and put in on a table.
Now with this trees I want to create one tree (fuse trees in the table).
If anyone have a solution.
Thanks.
[537 byte] By [
danio] at [2007-9-26 2:00:31]

See this example of merge.
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.text.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
class Demo {
private JFrame frame;
JScrollPane scroll1;
JScrollPane scroll2;
JTree tree1;
JTree tree2;
public Demo() throws Exception {
frame=new JFrame();
frame.getContentPane().setLayout(new BorderLayout());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel p=new JPanel(new GridLayout(1,2));
DefaultMutableTreeNode node,node1;
DefaultMutableTreeNode root1=new DefaultMutableTreeNode("root");
node=new DefaultMutableTreeNode("1");
root1.add(node);
node1=new DefaultMutableTreeNode("11");
node.add(node1);
node1=new DefaultMutableTreeNode("12");
node.add(node1);
node=new DefaultMutableTreeNode("2");
node1=new DefaultMutableTreeNode("21");
node.add(node1);
root1.add(node);
DefaultTreeModel m=new DefaultTreeModel(root1);
tree1=new JTree(m);
scroll1=new JScrollPane(tree1);
p.add(scroll1);
DefaultMutableTreeNode root2=new DefaultMutableTreeNode("root");
node=new DefaultMutableTreeNode("1");
root2.add(node);
node1=new DefaultMutableTreeNode("11");
node.add(node1);
node1=new DefaultMutableTreeNode("13");
node.add(node1);
node=new DefaultMutableTreeNode("3");
node1=new DefaultMutableTreeNode("31");
node.add(node1);
root2.add(node);
m=new DefaultTreeModel(root2);
tree2=new JTree(m);
scroll2=new JScrollPane(tree2);
p.add(scroll2);
frame.getContentPane().add(p,BorderLayout.CENTER);
JButton b=new JButton("merge");
ActionListener lst=new ActionListener() {
public void actionPerformed (ActionEvent e) {
merge(tree1,tree2);
((DefaultTreeModel)tree1.getModel()).reload();
((DefaultTreeModel)tree2.getModel()).reload();
}
};
b.addActionListener(lst);
frame.getContentPane().add(b,BorderLayout.SOUTH);
frame.pack();
frame.show();
}
public void merge(JTree firstTree,JTree secondTree) {
DefaultMutableTreeNode root1=(DefaultMutableTreeNode)((DefaultTreeModel)firstTree.getModel()).getRoot();
DefaultMutableTreeNode root2=(DefaultMutableTreeNode)((DefaultTreeModel)secondTree.getModel()).getRoot();
mergeNodes(root2,root1);
}
private void mergeNodes(DefaultMutableTreeNode source
,DefaultMutableTreeNode dest) {
int cnt=source.getChildCount();
for (int i=0; i<cnt; i++) {
DefaultMutableTreeNode child=(DefaultMutableTreeNode)source.getChildAt(i);
int ind=isContained(dest,child);
if (ind==-1) {
dest.add(child);
}
else {
mergeNodes(child,(DefaultMutableTreeNode)dest.getChildAt(ind));
}
}
}
private int isContained(DefaultMutableTreeNode parent, DefaultMutableTreeNode child) {
int result=-1;
int cnt=parent.getChildCount();
for (int i=0; i><cnt; i++) {
if (((DefaultMutableTreeNode)parent.getChildAt(i)).getUserObject().equals(child.getUserObject())) {
return i;
}
}
return result;
}
public static void main(String[] argv)
throws Exception
{
Demo html = new Demo();
}
}
regards
Stas>