服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

java swing的拖放例子


  我从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();

扫描关注微信公众号