|
我从java.sun.com和javaworld.com上的例子改过来的一棵文件系统树,支持拖放,ctrl+v复制文件
import java.awt.alphacomposite; import java.awt.component; import java.awt.graphics2d; import java.awt.point; import java.awt.rectangle; import java.awt.toolkit; 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.dragsourcedragevent; import java.awt.dnd.dragsourcedropevent; import java.awt.dnd.dragsourceevent; import java.awt.dnd.dragsourcelistener; import java.awt.dnd.droptarget; import java.awt.dnd.droptargetdragevent; import java.awt.dnd.droptargetdropevent; import java.awt.dnd.droptargetevent; import java.awt.dnd.droptargetlistener; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.awt.event.keyadapter; import java.awt.event.keyevent; import java.awt.geom.affinetransform; import java.awt.geom.rectangle2d; import java.awt.image.bufferedimage; import java.io.file; import java.io.fileinputstream; import java.io.fileoutputstream; import java.io.ioexception; import java.util.iterator; import java.util.list;
import javax.swing.icon; import javax.swing.jlabel; import javax.swing.jtree; import javax.swing.timer; import javax.swing.event.treeexpansionevent; import javax.swing.event.treeexpansionlistener; import javax.swing.filechooser.filesystemview; import javax.swing.tree.defaultmutabletreenode; import javax.swing.tree.defaulttreecellrenderer; import javax.swing.tree.defaulttreemodel; import javax.swing.tree.treepath;
class dragtree extends jtree implements draggesturelistener, dragsourcelistener, droptargetlistener { bufferedimage ghostimage;
private rectangle2d ghostrect = new rectangle2d.float();
private point ptoffset = new point();
private point lastpoint = new point();
private treepath lastpath;
private timer hovertimer;
filenode sourcenode;
public dragtree() { dragsource dragsource = dragsource.getdefaultdragsource();
dragsource.createdefaultdraggesturerecognizer(this, // component where // drag originates dndconstants.action_copy_or_move, // actions this); // drag gesture recognizer setmodel(createtreemodel());
addtreeexpansionlistener(new treeexpansionlistener() { public void treecollapsed(treeexpansionevent e) { }
public void treeexpanded(treeexpansionevent e) { treepath path = e.getpath();
if (path != null) { filenode node = (filenode) path.getlastpathcomponent();
if (!node.isexplored()) { defaulttreemodel model = (defaulttreemodel) getmodel(); node.explore(); model.nodestructurechanged(node); } } } }); this.setcellrenderer(new defaulttreecellrenderer() {
public component gettreecellrenderercomponent(jtree tree, object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasfocus) { treepath tp = tree.getpathforrow(row); if (tp != null) { filenode node = (filenode) tp.getlastpathcomponent(); file f = node.getfile(); try { icon icon = filesystemview.getfilesystemview() .getsystemicon(f); this.seticon(icon); this.setleaficon(icon); this.setopenicon(icon); this.setclosedicon(icon); this.setdisabledicon(icon); } catch (exception e) { e.printstacktrace(); } } return super.gettreecellrenderercomponent(tree, value, selected, expanded, leaf, row, hasfocus); }
});
super.setscrollsonexpand(true); new droptarget(this, dndconstants.action_copy_or_move, this);
// set up a hover timer, so that a node will be automatically expanded // or collapsed // if the user lingers on it for more than a short time hovertimer = new timer(1000, new actionlistener() { public void actionperformed(actionevent e) { if (lastpath == null) { return; } if (getrowforpath(lastpath) == 0) return; // do nothing if we are hovering over the root node if (isexpanded(lastpath)) collapsepath(lastpath); else expandpath(lastpath); } }); hovertimer.setrepeats(false); // set timer to one-shot mode
this.addkeylistener(new keyadapter() {
public void keypressed(keyevent e) { int code = e.getkeycode(); int modifiers = e.getmodifiers(); if (code == v || code == v) { system.out.println("find v"); system.out.println("modifiers:" + modifiers + "\t" + ((modifiers & keyevent.ctrl_mask) != 0)); }
if ((modifiers & keyevent.ctrl_mask) != 0 && (code == v || code == v)) { transferable tr = toolkit.getdefaulttoolkit() .getsystemclipboard().getcontents(null);
treepath path = getselectionpath(); if (path == null) { return; } filenode node = (filenode) path.getlastpathcomponent(); if (node.isdirectory()) { system.out.println("file cp"); try { list list = (list) (tr .gettransferdata(dataflavor.javafilelistflavor)); iterator iterator = list.iterator(); file parent = node.getfile(); while (iterator.hasnext()) { file f = (file) iterator.next(); cp(f, new file(parent, f.getname())); } node.reexplore(); } catch (exception ioe) { ioe.printstacktrace(); } updateui(); } } }
}); }
public void draggesturerecognized(draggestureevent e) { // drag anything ...
treepath path = getleadselectionpath(); if (path == null) return; filenode node = (filenode) path.getlastpathcomponent(); sourcenode = node; // work out the offset of the drag point from the treepath bounding // rectangle origin rectangle rapath = getpathbounds(path); point ptdragorigin = e.getdragorigin(); ptoffset.setlocation(ptdragorigin.x - rapath.x, ptdragorigin.y - rapath.y); // get the cell renderer (which is a jlabel) for the path being dragged int row = this.getrowforlocation(ptdragorigin.x, ptdragorigin.y); jlabel lbl = (jlabel) getcellrenderer().gettreecellrenderercomponent( this, // tree path.getlastpathcomponent(), // value false, // isselected (dont want a colored background) isexpanded(path), // isexpanded getmodel().isleaf(path.getlastpathcomponent()), // isleaf row, // row (not important for rendering) false // hasfocus (dont want a focus rectangle) ); lbl.setsize((int) rapath.getwidth(), (int) rapath.getheight()); // <-- // the // layout // manager // would // normally // do // this
// get a buffered image of the selection for dragging a ghost image this.ghostimage = new bufferedimage((int) rapath.getwidth(), (int) rapath.getheight(), bufferedimage.type_int_argb_pre); graphics2d g2 = ghostimage.creategraphics();
// ask the cell renderer to paint itself into the bufferedimage g2.setcomposite(alphacomposite.getinstance(alphacomposite.src, 0.5f)); // make the image ghostlike lbl.paint(g2);
g2.dispose(); //this.getgraphics().drawimage(ghostimage, e.getdragorigin().x, // e.getdragorigin().y, this);
e.startdrag(null, // cursor ghostimage, new point(5, 5), new stringselection(getfilename()), // transferable this); // drag source listener }
public void dragdropend(dragsourcedropevent e) { ghostimage = null; sourcenode = null; }
public void dragenter(dragsourcedragevent e) { }
public void dragexit(dragsourceevent e) { if (!dragsource.isdragimagesupported()) { repaint(ghostrect.getbounds()); } }
public void dragover(dragsourcedragevent e) {
}
public void dropactionchanged(dragsourcedragevent e) { }
public string getfilename() { treepath path = getleadselectionpath(); filenode node = (filenode) path.getlastpathcomponent(); return ((file) node.getuserobject()).getabsolutepath(); }
private defaulttreemodel createtreemodel() { file root = filesystemview.getfilesystemview().getroots()[0]; filenode rootnode = new filenode(root);
rootnode.explore(); return new defaulttreemodel(rootnode); }
public void dragenter(droptargetdragevent dtde) {
}
public void dragover(droptargetdragevent dtde) {
point pt = dtde.getlocation(); if (pt.equals(lastpoint)) { return; } if (ghostimage != null) { graphics2d g2 = (graphics2d) getgraphics(); // if a drag image is not supported by the platform, then draw my // own drag image if (!dragsource.isdragimagesupported()) { paintimmediately(ghostrect.getbounds()); // rub out the last // ghost image and cue // line // and remember where we are about to draw the new ghost image ghostrect.setrect(pt.x - ptoffset.x, pt.y - ptoffset.y, ghostimage.getwidth(), ghostimage.getheight()); g2.drawimage((ghostimage), affinetransform .gettranslateinstance(ghostrect.getx(), ghostrect .gety()), null); } } treepath path = getclosestpathforlocation(pt.x, pt.y); if (!(path == lastpath)) { lastpath = path; hovertimer.restart(); } }
public void dropactionchanged(droptargetdragevent dtde) {
}
public void drop(droptargetdropevent e) { try { dataflavor stringflavor = dataflavor.stringflavor; transferable tr = e.gettransferable();
treepath path = this.getpathforlocation(e.getlocation().x, e .getlocation().y); if (path == null) { e.rejectdrop(); return; } filenode node = (filenode) path.getlastpathcomponent(); if (e.isdataflavorsupported(dataflavor.javafilelistflavor) && node.isdirectory()) { e.acceptdrop(dndconstants.action_copy_or_move); system.out.println("file cp"); list list = (list) (e.gettransferable() .gettransferdata(dataflavor.javafilelistflavor)); iterator iterator = list.iterator(); 共2页: 上一页 1 [2] 下一页
|
|