Java JTree 实现两棵树之间节点拖拽

程序效果图:

用到的图片:

-----------------------------NodeData.java-----------------------------------

package treeTest;

import java.awt.Component;

import javax.swing.ImageIcon;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;


interface DBObjectType
{
int COUNTRY = 0;
int PROVINCE = 1;
int CITY = 2;

}
public class NodeData {
public int nodeType;
public String nodeData;
public NodeData(int nodeType,String nodeData){
this.nodeType = nodeType;
this.nodeData = nodeData;
}
public String toString(){
return nodeData;
}
}
class MyRenderer extends DefaultTreeCellRenderer{
//初始化5个图标
ImageIcon countryIcon = new ImageIcon("icon/root.png");
ImageIcon provinceIcon = new ImageIcon("icon/province.png");
ImageIcon cityIcon = new ImageIcon("icon/city.png");

public Component getTreeCellRendererComponent(JTree tree
,Object value, boolean sel,boolean expanded
,boolean leaf,int row,boolean hasFo){
//执行父类默认的节点绘制操作
super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFo);
DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
NodeData data = (NodeData)node.getUserObject();
ImageIcon icon = null;
switch(data.nodeType){
case DBObjectType.COUNTRY:
icon = countryIcon;
break;
case DBObjectType.PROVINCE:
icon = provinceIcon;
break;
case DBObjectType.CITY:
icon = cityIcon;
break;
}
this.setIcon(icon);
return this;
}
}

-------------------------------------------------------------DargTree-----------------------------------------------------

---------------------------------------------------------实现拖拽的关键代码--------------------------------------------------

package treeTest;
import java.awt.*;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragSource;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetAdapter;
import java.awt.dnd.DropTargetDropEvent;
import java.io.IOException;

import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;

public class DragTree extends JFrame{
JTree lefttree ;
JTree righttree;

//定义左右树的TreeModel对象
DefaultTreeModel leftmodel;
DefaultTreeModel rightmodel;
//定义几个初始节点
DefaultMutableTreeNode country = new DefaultMutableTreeNode(new NodeData(DBObjectType.COUNTRY,"国家"));
DefaultMutableTreeNode province = new DefaultMutableTreeNode(new NodeData(DBObjectType.PROVINCE,"省/直辖市"));
DefaultMutableTreeNode city = new DefaultMutableTreeNode(new NodeData(DBObjectType.CITY,"市/区"));
DefaultMutableTreeNode China= new DefaultMutableTreeNode(new NodeData(DBObjectType.COUNTRY,"中国"));
DefaultMutableTreeNode changping= new DefaultMutableTreeNode(new NodeData(DBObjectType.CITY,"昌平"));
DefaultMutableTreeNode beijing= new DefaultMutableTreeNode(new NodeData(DBObjectType.PROVINCE,"北京"));
DefaultMutableTreeNode haidian= new DefaultMutableTreeNode(new NodeData(DBObjectType.CITY,"海淀"));

//定义需要被拖动的TreePath
TreePath movePath;

public DragTree(){
setSize(300, 300);
//添加节点
province.add(city);
country.add(province);

beijing.add(changping);
beijing.add(haidian);
China.add(beijing);

lefttree = new JTree(country);
righttree = new JTree(China);

lefttree.setCellRenderer(new MyRenderer());
righttree.setCellRenderer(new MyRenderer());
//分别获得左右树的TreeModel对象
leftmodel = (DefaultTreeModel)lefttree.getModel();
rightmodel = (DefaultTreeModel)righttree.getModel();

//设置两棵树可编辑,这样可以增删节点
lefttree.setEditable(true);
righttree.setEditable(true);

//lefttree.setDragEnabled(true);
//righttree.setDragEnabled(true);

final Box box = new Box(BoxLayout.X_AXIS);
box.add(new JScrollPane(lefttree));
box.add(new JScrollPane(righttree));
add(box);

DragSource dragSource = DragSource.getDefaultDragSource();
//将lefttree转换成拖放源,它能接受复制,移动两种操作
dragSource.createDefaultDragGestureRecognizer(lefttree, DnDConstants.ACTION_COPY_OR_MOVE,new DragGestureListener() {

@Override
public void dragGestureRecognized(DragGestureEvent dge) {
// TODO Auto-generated method stub
//将lefttree选中的节点封装成Transferable对象
//TreePath tp = lefttree.getSelectionPath();
DefaultMutableTreeNode tn = (DefaultMutableTreeNode) lefttree.getLastSelectedPathComponent();
NodeData nd = (NodeData)tn.getUserObject();
String nodedata = String.valueOf(nd.nodeData);
Transferable transferable = new StringSelection(nodedata);
dge.startDrag(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR), transferable);
}
});
new DropTarget(this.righttree,DnDConstants.ACTION_COPY_OR_MOVE,new TreeNodeDropTargetListener());
}
class TreeNodeDropTargetListener extends DropTargetAdapter
{

@Override
public void drop(DropTargetDropEvent dtde) {
// TODO Auto-generated method stub
//接受复制、移动操作
dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
//获取拖放的内容
Transferable transferable = dtde.getTransferable();
String s = null;
try {
s = (String) transferable.getTransferData(DataFlavor.stringFlavor);
} catch (UnsupportedFlavorException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String sheng = "省";
String qu = "区";
if(s.contains(sheng)){
DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(new NodeData(DBObjectType.PROVINCE,"省/直辖市"));
TreePath tp = righttree.getPathForLocation(dtde.getLocation().x,dtde.getLocation().y);
((DefaultMutableTreeNode)tp.getLastPathComponent()).add(newNode);
righttree.updateUI();
return;
}

if(s.contains(qu)){
DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(new NodeData(DBObjectType.CITY,"市/区"));

TreePath tp = righttree.getPathForLocation(dtde.getLocation().x,dtde.getLocation().y);
((DefaultMutableTreeNode)tp.getLastPathComponent()).add(newNode);
}else
dtde.rejectDrop();
righttree.updateUI();


}
}
}

 

------------------------------------------------test主函数-------------------------------------------------------

package treeTest;
import javax.swing.*;
public class Test {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
JFrame frame = new DragTree();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}

}

 

posted @ 2016-03-23 12:42  小小小竹子  阅读(1675)  评论(0编辑  收藏  举报