请教JTree如何实现两棵树之间的互相选择?(内详) 在界面上初始化有两棵树,左边是一棵初始化完的树,右边是棵空树,选中左边的树的节点(不管是叶子还是非叶子),可以转移到右边树上对应的位置(包含它的子孙),同时删除左边树上此节点和所有子孙节点。请给代码示例,谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 昨天写好了,忘发了,今天给你发了,看看满不满足你的要求吧^o^package com.ddpie.frame;import java.awt.BorderLayout;import java.awt.GridLayout;import java.util.ArrayList;import java.util.List;import javax.swing.BorderFactory;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTree;import javax.swing.event.TreeSelectionEvent;import javax.swing.event.TreeSelectionListener;import javax.swing.tree.DefaultMutableTreeNode;import javax.swing.tree.DefaultTreeModel;import javax.swing.tree.MutableTreeNode;import javax.swing.tree.TreeNode;import javax.swing.tree.TreePath;public class TestJTree { public static List paths = new ArrayList(); public static void getAllChildren(DefaultTreeModel model,TreeNode node){ if(node.isLeaf()){ paths.add(model.getPathToRoot(node)); return; } for(int i=0 ; i<node.getChildCount() ; i++){ getAllChildren(model,node.getChildAt(i)); } } public static void main(String[] args) { JFrame frame = new JFrame(); frame.setSize(600,400); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel mainPanel = new JPanel(); frame.getContentPane().add(mainPanel); mainPanel.setLayout(new GridLayout(1,2)); JPanel leftPanel = new JPanel(); JPanel rightPanel = new JPanel(); mainPanel.add(leftPanel); mainPanel.add(rightPanel); leftPanel.setBorder(BorderFactory.createEtchedBorder()); rightPanel.setBorder(BorderFactory.createEtchedBorder()); leftPanel.setLayout(new BorderLayout()); rightPanel.setLayout(new BorderLayout()); final JTree leftTree = new JTree(); final DefaultTreeModel leftModel = (DefaultTreeModel)leftTree.getModel(); final JTree rightTree = new JTree( new DefaultTreeModel( new DefaultMutableTreeNode("JTree"))); leftTree.addTreeSelectionListener(new TreeSelectionListener(){ public void valueChanged(TreeSelectionEvent e) { TreePath path = leftTree.getSelectionPath(); TreeNode nowNode = (TreeNode)path.getLastPathComponent(); paths.clear(); getAllChildren(leftModel,nowNode); try{ leftModel.removeNodeFromParent( (MutableTreeNode)path.getLastPathComponent()); } catch(Exception ee){} for(int n=0 ; n<paths.size() ; n++){ Object[] nodes = (Object[])paths.get(n); DefaultTreeModel rightModel = (DefaultTreeModel)rightTree.getModel(); Object parent = rightModel.getRoot(); for(int i=1 ; i<nodes.length ; i++){ boolean find = false; int subNodesNum = rightModel.getChildCount(parent); for(int j=0 ; j<subNodesNum ; j++){ if(nodes[i].toString().equals( rightModel.getChild(parent, j).toString())){ find = true; parent = rightModel.getChild(parent, j); break; } } if(find==false){ DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(nodes[i]); rightModel.insertNodeInto( newNode, (MutableTreeNode)parent, 0); parent = newNode; } } } } }); leftPanel.add(new JScrollPane(leftTree)); rightPanel.add(new JScrollPane(rightTree)); frame.setVisible(true); }} to:ddpie,写的很不错,但是当树的深度增加后,就会不按照预想的情况发生,可能还需要斟酌的地方,加入测试数据后的代码如下,可以运行下!import java.awt.BorderLayout;import java.awt.GridLayout;import java.util.ArrayList;import java.util.List;import javax.swing.BorderFactory;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTree;import javax.swing.event.TreeSelectionEvent;import javax.swing.event.TreeSelectionListener;import javax.swing.tree.DefaultMutableTreeNode;import javax.swing.tree.DefaultTreeModel;import javax.swing.tree.MutableTreeNode;import javax.swing.tree.TreeNode;import javax.swing.tree.TreePath;public class TestJTree { public static List paths = new ArrayList(); public static void getAllChildren(DefaultTreeModel model,TreeNode node){ if(node.isLeaf()){ paths.add(model.getPathToRoot(node)); return; } for(int i=0 ; i<node.getChildCount() ; i++){ getAllChildren(model,node.getChildAt(i)); } } public static void main(String[] args) { JFrame frame = new JFrame(); frame.setSize(600,400); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel mainPanel = new JPanel(); frame.getContentPane().add(mainPanel); mainPanel.setLayout(new GridLayout(1,2)); JPanel leftPanel = new JPanel(); JPanel rightPanel = new JPanel(); mainPanel.add(leftPanel); mainPanel.add(rightPanel); leftPanel.setBorder(BorderFactory.createEtchedBorder()); rightPanel.setBorder(BorderFactory.createEtchedBorder()); leftPanel.setLayout(new BorderLayout()); rightPanel.setLayout(new BorderLayout()); DefaultMutableTreeNode rootLeft=new DefaultMutableTreeNode("root"); final JTree leftTree = new JTree(rootLeft); { DefaultMutableTreeNode node1=new DefaultMutableTreeNode("1"); DefaultMutableTreeNode node2=new DefaultMutableTreeNode("2"); DefaultMutableTreeNode node3=new DefaultMutableTreeNode("3"); DefaultMutableTreeNode node4=new DefaultMutableTreeNode("4"); rootLeft.add(node1); rootLeft.add(node2); rootLeft.add(node3); rootLeft.add(node4); DefaultMutableTreeNode node11=new DefaultMutableTreeNode("11"); DefaultMutableTreeNode node12=new DefaultMutableTreeNode("12"); DefaultMutableTreeNode node13=new DefaultMutableTreeNode("13"); DefaultMutableTreeNode node14=new DefaultMutableTreeNode("14"); DefaultMutableTreeNode node15=new DefaultMutableTreeNode("15"); node1.add(node11); node1.add(node12); node1.add(node13); node1.add(node14); node1.add(node15); DefaultMutableTreeNode node21=new DefaultMutableTreeNode("21"); DefaultMutableTreeNode node22=new DefaultMutableTreeNode("22"); DefaultMutableTreeNode node23=new DefaultMutableTreeNode("23"); node2.add(node21); node2.add(node22); node2.add(node23); DefaultMutableTreeNode node34=new DefaultMutableTreeNode("34"); DefaultMutableTreeNode node31=new DefaultMutableTreeNode("31"); DefaultMutableTreeNode node32=new DefaultMutableTreeNode("32"); node3.add(node31); node3.add(node32); node3.add(node34); DefaultMutableTreeNode node42=new DefaultMutableTreeNode("42"); DefaultMutableTreeNode node41=new DefaultMutableTreeNode("41"); DefaultMutableTreeNode node43=new DefaultMutableTreeNode("43"); node4.add(node41); node4.add(node42); node4.add(node43); DefaultMutableTreeNode node111=new DefaultMutableTreeNode("111"); node11.add(node111); DefaultMutableTreeNode node121=new DefaultMutableTreeNode("121"); node12.add(node121); DefaultMutableTreeNode node131=new DefaultMutableTreeNode("131"); node13.add(node131); DefaultMutableTreeNode node141=new DefaultMutableTreeNode("141"); node14.add(node141); DefaultMutableTreeNode node151=new DefaultMutableTreeNode("151"); node15.add(node151); } final DefaultTreeModel leftModel = (DefaultTreeModel)leftTree.getModel(); final JTree rightTree = new JTree( new DefaultTreeModel( new DefaultMutableTreeNode("JTree"))); leftTree.addTreeSelectionListener(new TreeSelectionListener(){ public void valueChanged(TreeSelectionEvent e) { TreePath path = leftTree.getSelectionPath(); TreeNode nowNode = (TreeNode)path.getLastPathComponent(); paths.clear(); getAllChildren(leftModel,nowNode); try{ leftModel.removeNodeFromParent( (MutableTreeNode)path.getLastPathComponent()); } catch(Exception ee){} for(int n=0 ; n<paths.size() ; n++){ Object[] nodes = (Object[])paths.get(n); DefaultTreeModel rightModel = (DefaultTreeModel)rightTree.getModel(); Object parent = rightModel.getRoot(); for(int i=1 ; i<nodes.length ; i++){ boolean find = false; int subNodesNum = rightModel.getChildCount(parent); for(int j=0 ; j<subNodesNum ; j++){ if(nodes[i].toString().equals( rightModel.getChild(parent, j).toString())){ find = true; parent = rightModel.getChild(parent, j); break; } } if(find==false){ DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(nodes[i]); rightModel.insertNodeInto( newNode, (MutableTreeNode)parent, 0); parent = newNode; } } } } }); leftPanel.add(new JScrollPane(leftTree)); rightPanel.add(new JScrollPane(rightTree)); frame.setVisible(true); }} 代码并没有问题,只是左边的树默认是不展开的,当你点击展开的时候同时也就复制到了右边,在删除左边树的时候出现了异常,因为根节点没有父节点,所以我改了一下代码,如果点击的是根节点就不会执行复制删除操作了,代码如下:package com.ddpie.frame;import java.awt.BorderLayout;import java.awt.GridLayout;import java.util.ArrayList;import java.util.List;import javax.swing.BorderFactory;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTree;import javax.swing.event.TreeSelectionEvent;import javax.swing.event.TreeSelectionListener;import javax.swing.tree.DefaultMutableTreeNode;import javax.swing.tree.DefaultTreeModel;import javax.swing.tree.MutableTreeNode;import javax.swing.tree.TreeNode;import javax.swing.tree.TreePath;public class TestJTree { public static List paths = new ArrayList(); public static void getAllChildren(DefaultTreeModel model, TreeNode node) { if (node.isLeaf()) { paths.add(model.getPathToRoot(node)); return; } for (int i = 0; i < node.getChildCount(); i++) { getAllChildren(model, node.getChildAt(i)); } } public static void main(String[] args) { JFrame frame = new JFrame(); frame.setSize(600, 400); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel mainPanel = new JPanel(); frame.getContentPane().add(mainPanel); mainPanel.setLayout(new GridLayout(1, 2)); JPanel leftPanel = new JPanel(); JPanel rightPanel = new JPanel(); mainPanel.add(leftPanel); mainPanel.add(rightPanel); leftPanel.setBorder(BorderFactory.createEtchedBorder()); rightPanel.setBorder(BorderFactory.createEtchedBorder()); leftPanel.setLayout(new BorderLayout()); rightPanel.setLayout(new BorderLayout()); DefaultMutableTreeNode rootLeft = new DefaultMutableTreeNode("root"); final JTree leftTree = new JTree(rootLeft); { DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("1"); DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("2"); DefaultMutableTreeNode node3 = new DefaultMutableTreeNode("3"); DefaultMutableTreeNode node4 = new DefaultMutableTreeNode("4"); rootLeft.add(node1); rootLeft.add(node2); rootLeft.add(node3); rootLeft.add(node4); DefaultMutableTreeNode node11 = new DefaultMutableTreeNode("11"); DefaultMutableTreeNode node12 = new DefaultMutableTreeNode("12"); DefaultMutableTreeNode node13 = new DefaultMutableTreeNode("13"); DefaultMutableTreeNode node14 = new DefaultMutableTreeNode("14"); DefaultMutableTreeNode node15 = new DefaultMutableTreeNode("15"); node1.add(node11); node1.add(node12); node1.add(node13); node1.add(node14); node1.add(node15); DefaultMutableTreeNode node21 = new DefaultMutableTreeNode("21"); DefaultMutableTreeNode node22 = new DefaultMutableTreeNode("22"); DefaultMutableTreeNode node23 = new DefaultMutableTreeNode("23"); node2.add(node21); node2.add(node22); node2.add(node23); DefaultMutableTreeNode node34 = new DefaultMutableTreeNode("34"); DefaultMutableTreeNode node31 = new DefaultMutableTreeNode("31"); DefaultMutableTreeNode node32 = new DefaultMutableTreeNode("32"); node3.add(node31); node3.add(node32); node3.add(node34); DefaultMutableTreeNode node42 = new DefaultMutableTreeNode("42"); DefaultMutableTreeNode node41 = new DefaultMutableTreeNode("41"); DefaultMutableTreeNode node43 = new DefaultMutableTreeNode("43"); node4.add(node41); node4.add(node42); node4.add(node43); DefaultMutableTreeNode node111 = new DefaultMutableTreeNode("111"); node11.add(node111); DefaultMutableTreeNode node121 = new DefaultMutableTreeNode("121"); node12.add(node121); DefaultMutableTreeNode node131 = new DefaultMutableTreeNode("131"); node13.add(node131); DefaultMutableTreeNode node141 = new DefaultMutableTreeNode("141"); node14.add(node141); DefaultMutableTreeNode node151 = new DefaultMutableTreeNode("151"); node15.add(node151); } final DefaultTreeModel leftModel = (DefaultTreeModel) leftTree .getModel(); final JTree rightTree = new JTree(new DefaultTreeModel( new DefaultMutableTreeNode("JTree"))); leftTree.addTreeSelectionListener(new TreeSelectionListener() { public void valueChanged(TreeSelectionEvent e) { TreePath path = leftTree.getSelectionPath(); if (path == null) return; System.out.println(path.getLastPathComponent().toString()); if(path.getLastPathComponent().toString().equals("root")) return; TreeNode nowNode = (TreeNode) path.getLastPathComponent(); paths.clear(); getAllChildren(leftModel, nowNode); leftModel.removeNodeFromParent((MutableTreeNode) path .getLastPathComponent()); for (int n = 0; n < paths.size(); n++) { Object[] nodes = (Object[]) paths.get(n); DefaultTreeModel rightModel = (DefaultTreeModel) rightTree .getModel(); Object parent = rightModel.getRoot(); for (int i = 1; i < nodes.length; i++) { boolean find = false; int subNodesNum = rightModel.getChildCount(parent); for (int j = 0; j < subNodesNum; j++) { if (nodes[i].toString().equals( rightModel.getChild(parent, j).toString())) { find = true; parent = rightModel.getChild(parent, j); break; } } if (find == false) { DefaultMutableTreeNode newNode = new DefaultMutableTreeNode( nodes[i]); rightModel.insertNodeInto(newNode, (MutableTreeNode) parent, 0); parent = newNode; } } } } }); leftPanel.add(new JScrollPane(leftTree)); rightPanel.add(new JScrollPane(rightTree)); frame.setVisible(true); }} 添加了一些注释,并做了一些修改,但是还是存在一个问题,假如说一个节点下有两个相同名称的子节点就会出现问题,原因就是我没有记录一个节点的子节点的相对位置,如果记录还需要一棵树,大家有什么好的想法吗?package com.ddpie.frame;import java.awt.BorderLayout;import java.awt.GridLayout;import java.util.ArrayList;import java.util.List;import javax.swing.BorderFactory;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTree;import javax.swing.event.TreeSelectionEvent;import javax.swing.event.TreeSelectionListener;import javax.swing.tree.DefaultMutableTreeNode;import javax.swing.tree.DefaultTreeModel;import javax.swing.tree.MutableTreeNode;import javax.swing.tree.TreeNode;import javax.swing.tree.TreePath;public class TestJTree { //保存本次操作所有要删除的叶子节点到根节点的路径 public static List paths = new ArrayList(); //递归获得该节点的所有子节点一直到叶子节点的路径,并保存在paths里面 public static void getAllChildren(DefaultTreeModel model, TreeNode node) { if (node.isLeaf()) {//如果是叶子节点就将从该节点到根节点的路径添加到paths中 paths.add(model.getPathToRoot(node)); return; } //如果不是叶子节点,则递归遍历该节点的所有子节点 for (int i = 0; i < node.getChildCount(); i++) { getAllChildren(model, node.getChildAt(i)); } } public static void main(String[] args) { JFrame frame = new JFrame(); frame.setSize(600, 400); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel mainPanel = new JPanel(); frame.getContentPane().add(mainPanel); mainPanel.setLayout(new GridLayout(1, 2)); JPanel leftPanel = new JPanel(); JPanel rightPanel = new JPanel(); mainPanel.add(leftPanel); mainPanel.add(rightPanel); leftPanel.setBorder(BorderFactory.createEtchedBorder()); rightPanel.setBorder(BorderFactory.createEtchedBorder()); leftPanel.setLayout(new BorderLayout()); rightPanel.setLayout(new BorderLayout()); DefaultMutableTreeNode rootLeft = new DefaultMutableTreeNode("root"); final JTree leftTree = new JTree(rootLeft);//左面的树 //初始化左面树的值 { DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("1"); DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("2"); DefaultMutableTreeNode node3 = new DefaultMutableTreeNode("3"); DefaultMutableTreeNode node4 = new DefaultMutableTreeNode("4"); rootLeft.add(node1); rootLeft.add(node2); rootLeft.add(node3); rootLeft.add(node4); DefaultMutableTreeNode node11 = new DefaultMutableTreeNode("11"); DefaultMutableTreeNode node12 = new DefaultMutableTreeNode("12"); DefaultMutableTreeNode node13 = new DefaultMutableTreeNode("13"); DefaultMutableTreeNode node14 = new DefaultMutableTreeNode("14"); DefaultMutableTreeNode node15 = new DefaultMutableTreeNode("15"); node1.add(node11); node1.add(node12); node1.add(node13); node1.add(node14); node1.add(node15); DefaultMutableTreeNode node21 = new DefaultMutableTreeNode("21"); DefaultMutableTreeNode node22 = new DefaultMutableTreeNode("22"); DefaultMutableTreeNode node23 = new DefaultMutableTreeNode("23"); node2.add(node21); node2.add(node22); node2.add(node23); DefaultMutableTreeNode node34 = new DefaultMutableTreeNode("34"); DefaultMutableTreeNode node31 = new DefaultMutableTreeNode("31"); DefaultMutableTreeNode node32 = new DefaultMutableTreeNode("32"); node3.add(node31); node3.add(node32); node3.add(node34); DefaultMutableTreeNode node42 = new DefaultMutableTreeNode("42"); DefaultMutableTreeNode node41 = new DefaultMutableTreeNode("41"); DefaultMutableTreeNode node43 = new DefaultMutableTreeNode("43"); node4.add(node41); node4.add(node42); node4.add(node43); DefaultMutableTreeNode node111 = new DefaultMutableTreeNode("111"); node11.add(node111); DefaultMutableTreeNode node121 = new DefaultMutableTreeNode("121"); node12.add(node121); DefaultMutableTreeNode node131 = new DefaultMutableTreeNode("131"); node13.add(node131); DefaultMutableTreeNode node141 = new DefaultMutableTreeNode("141"); node14.add(node141); DefaultMutableTreeNode node151 = new DefaultMutableTreeNode("151"); node15.add(node151); } //左面树的TreeModel final DefaultTreeModel leftModel = (DefaultTreeModel) leftTree .getModel(); //只有根节点的右面的树 final JTree rightTree = new JTree(new DefaultTreeModel( new DefaultMutableTreeNode("root"))); //为左面树添加选择事件监听 leftTree.addTreeSelectionListener(new TreeSelectionListener() { public void valueChanged(TreeSelectionEvent e) { //获得当前选择的节点路径 TreePath path = leftTree.getSelectionPath(); if (path == null) return; //如果是根节点就返回 if(path.getLastPathComponent().equals(leftModel.getRoot())) return; TreeNode nowNode = (TreeNode) path.getLastPathComponent(); paths.clear(); getAllChildren(leftModel, nowNode);//得到选中节点子树的所有叶子节点到根节点的路径 //复制选中的路径,包括最后一个节点的子树 for (int n = 0; n < paths.size(); n++) {//遍历选中节点的子树所有叶子节点到根节点的路径 Object[] nodes = (Object[]) paths.get(n); DefaultTreeModel rightModel = (DefaultTreeModel) rightTree .getModel(); Object parent = rightModel.getRoot(); for (int i = 1; i < nodes.length; i++) {//遍历某个叶子节点到根节点路径上的所有节点 boolean find = false;//判断路径上的某个节点在右边树中是否存在 int subNodesNum = rightModel.getChildCount(parent); //Start...判断两个节点是否相等 //判断依据为两个节点的所有对应Parent均相等 for (int j = 0; j < subNodesNum; j++) { TreeNode[] leftPath =//要比较的左边节点到左边树根节点的路径 leftModel.getPathToRoot((TreeNode)nodes[i]); TreeNode[] rightPath =//要比较的右边节点到右边树根节点的路径 rightModel.getPathToRoot((TreeNode)rightModel.getChild(parent, j)); if(leftPath.length!=rightPath.length){//如果路径长度不相等则着两个节点肯定不相等 continue; } boolean subFind = true;//假设着两个节点相等 for(int ii=0 ; ii<leftPath.length ; ii++){ //如果发现这两个节点到对应树根节点的路径上有某个节点的名称不相等,则这两个节点不等 if(!leftPath[ii].toString().equals(rightPath[ii].toString())){ subFind = false; break; } } //End...判断两个节点是否相等 if (subFind) {//如果两个节点相等,则路径上的该节点在右边树上存在 find = true; //将该节点作为新的父节点 parent = rightModel.getChild(parent, j); break; } } //如果右边树上不存在这个节点,则在右边树上的相应父亲节点下添加新的节点 if (find == false) { DefaultMutableTreeNode newNode = new DefaultMutableTreeNode( nodes[i]); rightModel.insertNodeInto(newNode, (MutableTreeNode) parent, 0); parent = newNode; } } } //删除左边树的相应项目 leftModel.removeNodeFromParent((MutableTreeNode) path .getLastPathComponent()); } }); leftPanel.add(new JScrollPane(leftTree)); rightPanel.add(new JScrollPane(rightTree)); frame.setVisible(true); }} 呵呵,多谢ddpie大虾,保持顺序可能需要userObject支持,需要记住原来在左边树上的兄弟节点中的位置。祝10.1愉快。 求助!JAVA图像 对头发染色 小程序,最后一行总是报错,贴出来了,大家帮忙看看:) java 写 properties 文件 求助 两个 数组 差集 ,或交集 继承中的不解 为什么我的substring(...)会不灵光啥? 请如何从一个中文字符串中找到某个汉字的index值? 在LINUX下有没有类似于Access的数据库,只要拷贝就能用 一个小问题。。。在线 关于可滚动的ResultSet对象,高分找高手帮忙! 超级菜鸟问一句话! java如何搜索目录中的文件和文件夹程序?
package com.ddpie.frame;import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.List;import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.MutableTreeNode;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;public class TestJTree {
public static List paths = new ArrayList();
public static void getAllChildren(DefaultTreeModel model,TreeNode node){
if(node.isLeaf()){
paths.add(model.getPathToRoot(node));
return;
}
for(int i=0 ; i<node.getChildCount() ; i++){
getAllChildren(model,node.getChildAt(i));
}
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setSize(600,400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel mainPanel = new JPanel();
frame.getContentPane().add(mainPanel);
mainPanel.setLayout(new GridLayout(1,2));
JPanel leftPanel = new JPanel();
JPanel rightPanel = new JPanel();
mainPanel.add(leftPanel);
mainPanel.add(rightPanel);
leftPanel.setBorder(BorderFactory.createEtchedBorder());
rightPanel.setBorder(BorderFactory.createEtchedBorder());
leftPanel.setLayout(new BorderLayout());
rightPanel.setLayout(new BorderLayout());
final JTree leftTree = new JTree();
final DefaultTreeModel leftModel = (DefaultTreeModel)leftTree.getModel();
final JTree rightTree = new JTree(
new DefaultTreeModel(
new DefaultMutableTreeNode("JTree")));
leftTree.addTreeSelectionListener(new TreeSelectionListener(){
public void valueChanged(TreeSelectionEvent e) {
TreePath path = leftTree.getSelectionPath();
TreeNode nowNode = (TreeNode)path.getLastPathComponent();
paths.clear();
getAllChildren(leftModel,nowNode);
try{
leftModel.removeNodeFromParent(
(MutableTreeNode)path.getLastPathComponent());
}
catch(Exception ee){}
for(int n=0 ; n<paths.size() ; n++){
Object[] nodes = (Object[])paths.get(n);
DefaultTreeModel rightModel = (DefaultTreeModel)rightTree.getModel();
Object parent = rightModel.getRoot();
for(int i=1 ; i<nodes.length ; i++){
boolean find = false;
int subNodesNum = rightModel.getChildCount(parent);
for(int j=0 ; j<subNodesNum ; j++){
if(nodes[i].toString().equals(
rightModel.getChild(parent, j).toString())){
find = true;
parent = rightModel.getChild(parent, j);
break;
}
}
if(find==false){
DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(nodes[i]);
rightModel.insertNodeInto(
newNode,
(MutableTreeNode)parent,
0);
parent = newNode;
}
}
}
}
});
leftPanel.add(new JScrollPane(leftTree));
rightPanel.add(new JScrollPane(rightTree));
frame.setVisible(true);
}}
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.List;import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.MutableTreeNode;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;public class TestJTree {
public static List paths = new ArrayList();
public static void getAllChildren(DefaultTreeModel model,TreeNode node){
if(node.isLeaf()){
paths.add(model.getPathToRoot(node));
return;
}
for(int i=0 ; i<node.getChildCount() ; i++){
getAllChildren(model,node.getChildAt(i));
}
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setSize(600,400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel mainPanel = new JPanel();
frame.getContentPane().add(mainPanel);
mainPanel.setLayout(new GridLayout(1,2));
JPanel leftPanel = new JPanel();
JPanel rightPanel = new JPanel();
mainPanel.add(leftPanel);
mainPanel.add(rightPanel);
leftPanel.setBorder(BorderFactory.createEtchedBorder());
rightPanel.setBorder(BorderFactory.createEtchedBorder());
leftPanel.setLayout(new BorderLayout());
rightPanel.setLayout(new BorderLayout());
DefaultMutableTreeNode rootLeft=new DefaultMutableTreeNode("root");
final JTree leftTree = new JTree(rootLeft);
{
DefaultMutableTreeNode node1=new DefaultMutableTreeNode("1");
DefaultMutableTreeNode node2=new DefaultMutableTreeNode("2");
DefaultMutableTreeNode node3=new DefaultMutableTreeNode("3");
DefaultMutableTreeNode node4=new DefaultMutableTreeNode("4");
rootLeft.add(node1);
rootLeft.add(node2);
rootLeft.add(node3);
rootLeft.add(node4);
DefaultMutableTreeNode node11=new DefaultMutableTreeNode("11");
DefaultMutableTreeNode node12=new DefaultMutableTreeNode("12");
DefaultMutableTreeNode node13=new DefaultMutableTreeNode("13");
DefaultMutableTreeNode node14=new DefaultMutableTreeNode("14");
DefaultMutableTreeNode node15=new DefaultMutableTreeNode("15");
node1.add(node11);
node1.add(node12);
node1.add(node13);
node1.add(node14);
node1.add(node15);
DefaultMutableTreeNode node21=new DefaultMutableTreeNode("21");
DefaultMutableTreeNode node22=new DefaultMutableTreeNode("22");
DefaultMutableTreeNode node23=new DefaultMutableTreeNode("23");
node2.add(node21);
node2.add(node22);
node2.add(node23);
DefaultMutableTreeNode node34=new DefaultMutableTreeNode("34");
DefaultMutableTreeNode node31=new DefaultMutableTreeNode("31");
DefaultMutableTreeNode node32=new DefaultMutableTreeNode("32");
node3.add(node31);
node3.add(node32);
node3.add(node34);
DefaultMutableTreeNode node42=new DefaultMutableTreeNode("42");
DefaultMutableTreeNode node41=new DefaultMutableTreeNode("41");
DefaultMutableTreeNode node43=new DefaultMutableTreeNode("43");
node4.add(node41);
node4.add(node42);
node4.add(node43);
DefaultMutableTreeNode node111=new DefaultMutableTreeNode("111");
node11.add(node111);
DefaultMutableTreeNode node121=new DefaultMutableTreeNode("121");
node12.add(node121);
DefaultMutableTreeNode node131=new DefaultMutableTreeNode("131");
node13.add(node131);
DefaultMutableTreeNode node141=new DefaultMutableTreeNode("141");
node14.add(node141);
DefaultMutableTreeNode node151=new DefaultMutableTreeNode("151");
node15.add(node151);
}
final DefaultTreeModel leftModel = (DefaultTreeModel)leftTree.getModel();
final JTree rightTree = new JTree(
new DefaultTreeModel(
new DefaultMutableTreeNode("JTree")));
leftTree.addTreeSelectionListener(new TreeSelectionListener(){
public void valueChanged(TreeSelectionEvent e) {
TreePath path = leftTree.getSelectionPath();
TreeNode nowNode = (TreeNode)path.getLastPathComponent();
paths.clear();
getAllChildren(leftModel,nowNode);
try{
leftModel.removeNodeFromParent(
(MutableTreeNode)path.getLastPathComponent());
}
catch(Exception ee){}
for(int n=0 ; n<paths.size() ; n++){
Object[] nodes = (Object[])paths.get(n);
DefaultTreeModel rightModel = (DefaultTreeModel)rightTree.getModel();
Object parent = rightModel.getRoot();
for(int i=1 ; i<nodes.length ; i++){
boolean find = false;
int subNodesNum = rightModel.getChildCount(parent);
for(int j=0 ; j<subNodesNum ; j++){
if(nodes[i].toString().equals(
rightModel.getChild(parent, j).toString())){
find = true;
parent = rightModel.getChild(parent, j);
break;
}
}
if(find==false){
DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(nodes[i]);
rightModel.insertNodeInto(
newNode,
(MutableTreeNode)parent,
0);
parent = newNode;
}
}
}
}
});
leftPanel.add(new JScrollPane(leftTree));
rightPanel.add(new JScrollPane(rightTree));
frame.setVisible(true);
}}
package com.ddpie.frame;import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.List;import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.MutableTreeNode;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;public class TestJTree { public static List paths = new ArrayList(); public static void getAllChildren(DefaultTreeModel model, TreeNode node) {
if (node.isLeaf()) {
paths.add(model.getPathToRoot(node));
return;
} for (int i = 0; i < node.getChildCount(); i++) {
getAllChildren(model, node.getChildAt(i));
}
} public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setSize(600, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel mainPanel = new JPanel();
frame.getContentPane().add(mainPanel);
mainPanel.setLayout(new GridLayout(1, 2));
JPanel leftPanel = new JPanel();
JPanel rightPanel = new JPanel();
mainPanel.add(leftPanel);
mainPanel.add(rightPanel);
leftPanel.setBorder(BorderFactory.createEtchedBorder());
rightPanel.setBorder(BorderFactory.createEtchedBorder());
leftPanel.setLayout(new BorderLayout());
rightPanel.setLayout(new BorderLayout()); DefaultMutableTreeNode rootLeft = new DefaultMutableTreeNode("root"); final JTree leftTree = new JTree(rootLeft);
{
DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("1");
DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("2");
DefaultMutableTreeNode node3 = new DefaultMutableTreeNode("3");
DefaultMutableTreeNode node4 = new DefaultMutableTreeNode("4");
rootLeft.add(node1);
rootLeft.add(node2);
rootLeft.add(node3);
rootLeft.add(node4); DefaultMutableTreeNode node11 = new DefaultMutableTreeNode("11");
DefaultMutableTreeNode node12 = new DefaultMutableTreeNode("12");
DefaultMutableTreeNode node13 = new DefaultMutableTreeNode("13");
DefaultMutableTreeNode node14 = new DefaultMutableTreeNode("14");
DefaultMutableTreeNode node15 = new DefaultMutableTreeNode("15"); node1.add(node11);
node1.add(node12);
node1.add(node13);
node1.add(node14);
node1.add(node15); DefaultMutableTreeNode node21 = new DefaultMutableTreeNode("21");
DefaultMutableTreeNode node22 = new DefaultMutableTreeNode("22");
DefaultMutableTreeNode node23 = new DefaultMutableTreeNode("23");
node2.add(node21);
node2.add(node22);
node2.add(node23); DefaultMutableTreeNode node34 = new DefaultMutableTreeNode("34");
DefaultMutableTreeNode node31 = new DefaultMutableTreeNode("31");
DefaultMutableTreeNode node32 = new DefaultMutableTreeNode("32"); node3.add(node31);
node3.add(node32);
node3.add(node34); DefaultMutableTreeNode node42 = new DefaultMutableTreeNode("42");
DefaultMutableTreeNode node41 = new DefaultMutableTreeNode("41");
DefaultMutableTreeNode node43 = new DefaultMutableTreeNode("43"); node4.add(node41);
node4.add(node42);
node4.add(node43); DefaultMutableTreeNode node111 = new DefaultMutableTreeNode("111");
node11.add(node111);
DefaultMutableTreeNode node121 = new DefaultMutableTreeNode("121");
node12.add(node121);
DefaultMutableTreeNode node131 = new DefaultMutableTreeNode("131");
node13.add(node131);
DefaultMutableTreeNode node141 = new DefaultMutableTreeNode("141");
node14.add(node141);
DefaultMutableTreeNode node151 = new DefaultMutableTreeNode("151");
node15.add(node151); } final DefaultTreeModel leftModel = (DefaultTreeModel) leftTree
.getModel();
final JTree rightTree = new JTree(new DefaultTreeModel(
new DefaultMutableTreeNode("JTree")));
leftTree.addTreeSelectionListener(new TreeSelectionListener() {
public void valueChanged(TreeSelectionEvent e) {
TreePath path = leftTree.getSelectionPath();
if (path == null)
return;
System.out.println(path.getLastPathComponent().toString());
if(path.getLastPathComponent().toString().equals("root"))
return;
TreeNode nowNode = (TreeNode) path.getLastPathComponent();
paths.clear();
getAllChildren(leftModel, nowNode);
leftModel.removeNodeFromParent((MutableTreeNode) path
.getLastPathComponent()); for (int n = 0; n < paths.size(); n++) {
Object[] nodes = (Object[]) paths.get(n);
DefaultTreeModel rightModel = (DefaultTreeModel) rightTree
.getModel();
Object parent = rightModel.getRoot();
for (int i = 1; i < nodes.length; i++) {
boolean find = false;
int subNodesNum = rightModel.getChildCount(parent);
for (int j = 0; j < subNodesNum; j++) {
if (nodes[i].toString().equals(
rightModel.getChild(parent, j).toString())) {
find = true;
parent = rightModel.getChild(parent, j);
break;
}
}
if (find == false) {
DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(
nodes[i]);
rightModel.insertNodeInto(newNode,
(MutableTreeNode) parent, 0);
parent = newNode;
}
}
}
}
});
leftPanel.add(new JScrollPane(leftTree));
rightPanel.add(new JScrollPane(rightTree)); frame.setVisible(true);
}}
package com.ddpie.frame;import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.List;import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.MutableTreeNode;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;public class TestJTree {
//保存本次操作所有要删除的叶子节点到根节点的路径
public static List paths = new ArrayList();
//递归获得该节点的所有子节点一直到叶子节点的路径,并保存在paths里面
public static void getAllChildren(DefaultTreeModel model, TreeNode node) {
if (node.isLeaf()) {//如果是叶子节点就将从该节点到根节点的路径添加到paths中
paths.add(model.getPathToRoot(node));
return;
} //如果不是叶子节点,则递归遍历该节点的所有子节点
for (int i = 0; i < node.getChildCount(); i++) {
getAllChildren(model, node.getChildAt(i));
}
} public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setSize(600, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel mainPanel = new JPanel();
frame.getContentPane().add(mainPanel);
mainPanel.setLayout(new GridLayout(1, 2));
JPanel leftPanel = new JPanel();
JPanel rightPanel = new JPanel();
mainPanel.add(leftPanel);
mainPanel.add(rightPanel);
leftPanel.setBorder(BorderFactory.createEtchedBorder());
rightPanel.setBorder(BorderFactory.createEtchedBorder());
leftPanel.setLayout(new BorderLayout());
rightPanel.setLayout(new BorderLayout()); DefaultMutableTreeNode rootLeft = new DefaultMutableTreeNode("root"); final JTree leftTree = new JTree(rootLeft);//左面的树
//初始化左面树的值
{
DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("1");
DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("2");
DefaultMutableTreeNode node3 = new DefaultMutableTreeNode("3");
DefaultMutableTreeNode node4 = new DefaultMutableTreeNode("4");
rootLeft.add(node1);
rootLeft.add(node2);
rootLeft.add(node3);
rootLeft.add(node4); DefaultMutableTreeNode node11 = new DefaultMutableTreeNode("11");
DefaultMutableTreeNode node12 = new DefaultMutableTreeNode("12");
DefaultMutableTreeNode node13 = new DefaultMutableTreeNode("13");
DefaultMutableTreeNode node14 = new DefaultMutableTreeNode("14");
DefaultMutableTreeNode node15 = new DefaultMutableTreeNode("15"); node1.add(node11);
node1.add(node12);
node1.add(node13);
node1.add(node14);
node1.add(node15); DefaultMutableTreeNode node21 = new DefaultMutableTreeNode("21");
DefaultMutableTreeNode node22 = new DefaultMutableTreeNode("22");
DefaultMutableTreeNode node23 = new DefaultMutableTreeNode("23");
node2.add(node21);
node2.add(node22);
node2.add(node23); DefaultMutableTreeNode node34 = new DefaultMutableTreeNode("34");
DefaultMutableTreeNode node31 = new DefaultMutableTreeNode("31");
DefaultMutableTreeNode node32 = new DefaultMutableTreeNode("32"); node3.add(node31);
node3.add(node32);
node3.add(node34); DefaultMutableTreeNode node42 = new DefaultMutableTreeNode("42");
DefaultMutableTreeNode node41 = new DefaultMutableTreeNode("41");
DefaultMutableTreeNode node43 = new DefaultMutableTreeNode("43"); node4.add(node41);
node4.add(node42);
node4.add(node43); DefaultMutableTreeNode node111 = new DefaultMutableTreeNode("111");
node11.add(node111);
DefaultMutableTreeNode node121 = new DefaultMutableTreeNode("121");
node12.add(node121);
DefaultMutableTreeNode node131 = new DefaultMutableTreeNode("131");
node13.add(node131);
DefaultMutableTreeNode node141 = new DefaultMutableTreeNode("141");
node14.add(node141);
DefaultMutableTreeNode node151 = new DefaultMutableTreeNode("151");
node15.add(node151); }
//左面树的TreeModel
final DefaultTreeModel leftModel = (DefaultTreeModel) leftTree
.getModel();
//只有根节点的右面的树
final JTree rightTree = new JTree(new DefaultTreeModel(
new DefaultMutableTreeNode("root")));
//为左面树添加选择事件监听
leftTree.addTreeSelectionListener(new TreeSelectionListener() {
public void valueChanged(TreeSelectionEvent e) {
//获得当前选择的节点路径
TreePath path = leftTree.getSelectionPath();
if (path == null)
return;
//如果是根节点就返回
if(path.getLastPathComponent().equals(leftModel.getRoot()))
return;
TreeNode nowNode = (TreeNode) path.getLastPathComponent();
paths.clear();
getAllChildren(leftModel, nowNode);//得到选中节点子树的所有叶子节点到根节点的路径 //复制选中的路径,包括最后一个节点的子树
for (int n = 0; n < paths.size(); n++) {//遍历选中节点的子树所有叶子节点到根节点的路径
Object[] nodes = (Object[]) paths.get(n);
DefaultTreeModel rightModel = (DefaultTreeModel) rightTree
.getModel();
Object parent = rightModel.getRoot();
for (int i = 1; i < nodes.length; i++) {//遍历某个叶子节点到根节点路径上的所有节点
boolean find = false;//判断路径上的某个节点在右边树中是否存在
int subNodesNum = rightModel.getChildCount(parent);
//Start...判断两个节点是否相等
//判断依据为两个节点的所有对应Parent均相等
for (int j = 0; j < subNodesNum; j++) {
TreeNode[] leftPath =//要比较的左边节点到左边树根节点的路径
leftModel.getPathToRoot((TreeNode)nodes[i]);
TreeNode[] rightPath =//要比较的右边节点到右边树根节点的路径
rightModel.getPathToRoot((TreeNode)rightModel.getChild(parent, j));
if(leftPath.length!=rightPath.length){//如果路径长度不相等则着两个节点肯定不相等
continue;
}
boolean subFind = true;//假设着两个节点相等
for(int ii=0 ; ii<leftPath.length ; ii++){
//如果发现这两个节点到对应树根节点的路径上有某个节点的名称不相等,则这两个节点不等
if(!leftPath[ii].toString().equals(rightPath[ii].toString())){
subFind = false;
break;
}
}
//End...判断两个节点是否相等
if (subFind) {//如果两个节点相等,则路径上的该节点在右边树上存在
find = true;
//将该节点作为新的父节点
parent = rightModel.getChild(parent, j);
break;
}
}
//如果右边树上不存在这个节点,则在右边树上的相应父亲节点下添加新的节点
if (find == false) {
DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(
nodes[i]);
rightModel.insertNodeInto(newNode,
(MutableTreeNode) parent,
0);
parent = newNode;
}
}
}
//删除左边树的相应项目
leftModel.removeNodeFromParent((MutableTreeNode) path
.getLastPathComponent());
}
});
leftPanel.add(new JScrollPane(leftTree));
rightPanel.add(new JScrollPane(rightTree)); frame.setVisible(true);
}}
祝10.1愉快。