关于jtree 之间的drag/drop一直找不到合适的方法。现通过鼠标事件的相应实现了该过程。希望和大家一起学习。
源码如下:
import javax.swing.*;
import javax.swing.event.*;
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import javax.swing.tree.*;
public class dragdroptree implements mousemotionlistener,mouselistener, draggesturelistener,dragsourcelistener
{
private jtree tree1=null;
private jtree tree2=null;
object lastnode;
vector vet=new vector();
treeselectionmodel selectionmodel=tree1.getselectionmodel();
vector vetnew=new vector();
private boolean drag=false;
public dragdroptree(jtree t1,jtree t2)
{
tree1=t1;
tree2=t2;
dragsource dragsource = dragsource.getdefaultdragsource();
dragsource.createdefaultdraggesturerecognizer(
tree1, // component where drag originates
dndconstants.action_copy_or_move, // actions
this); // drag gesture recognizer
dragsource.createdefaultdraggesturerecognizer(
tree2, // component where drag originates
dndconstants.action_copy_or_move, // actions
this); // drag gesture recognizer
tree1.addmousemotionlistener(this);
tree1.addmouselistener(this);
tree2.addmousemotionlistener(this);
tree2.addmouselistener(this);
}
public void mouseentered(mouseevent e)
{
jtree selecttree=(jtree)e.getsource();
treepath path=selecttree.getpathforlocation(e.getx(), e.gety());
if(path!=null)
{
if(drag&vet!=null)
{
drag=false;
string str=path.getpathcomponent(1).tostring();
mutabletreenode parent,node=(mutabletreenode)path.getlastpathcomponent();
if(node.isleaf())
parent=(mutabletreenode)node.getparent();
else
parent=node;
int index=parent.getindex(node)+1;
system.out.println("now node is in "+index+"level");
defaulttreemodel model=(defaulttreemodel)tree2.getmodel();
int j=0;
while(j<vet.size())
{
string ss=vet.elementat(j).tostring();
mutabletreenode newnode=new defaultmutabletreenode(ss);
model.insertnodeinto(newnode,parent,index);
j++;
}
vet=null;
vet=new vector();
}
else;
}
else;
}
public void mousedragged(mouseevent e){
drag=true;
if(selectionmodel!=null)selectionmodel.clearselection();
}
public void mousemoved(mouseevent e){}
public void mouseclicked(mouseevent e){}
public void mouseexited(mouseevent e){}
public void mousepressed(mouseevent e)
{
lastnode=null;
if(e.getclickcount()==1)
{
treepath path=tree1.getpathforlocation(e.getx(), e.gety());
if(path!=null){
treenode node=(treenode)path.getlastpathcomponent();
if(node.isleaf())
{
lastnode=(mutabletreenode)path.getlastpathcomponent();
treeselectionmodel selectionmodel=tree1.getselectionmodel();
int a=selectionmodel.getselectioncount();
system.out.println("node is :"+a);
if(a>1)
{
if(vetnew!=null){
system.out.println(vetnew.size()+"have so much path");
for(int n=0;n<vetnew.size();n++)
{
treepath p=(treepath)vetnew.get(n);
system.out.println(p);
if(p==path)path=null;
}
}
if(path!=null)
{
vet.addelement(lastnode);
vetnew.addelement(path);
}
}
else
{
if(vet!=null)
{
vet.removeallelements();
vet.addelement(lastnode);
}
if(vetnew!=null)
{
vetnew.removeallelements();
vetnew.addelement(path);
}
}
}
else
joptionpane.showmessagedialog(this,"please select a leaf node!");
}
}
}
public void mousereleased(mouseevent e){}
public void draggesturerecognized(draggestureevent e) {
// drag anything ...
e.startdrag(dragsource.defaultcopydrop, // cursor
new stringselection("drag well"), // transferable
this); // drag source listener
drag=true;
}
public void dragdropend(dragsourcedropevent e) {}
public void dragenter(dragsourcedragevent e) {}
public void dragexit(dragsourceevent e) {}
public void dragover(dragsourcedragevent e) {}
public void dropactionchanged(dragsourcedragevent e) {}
闽公网安备 35060202000074号