*设为首页
*加入收藏
热门关键字: JAVA
>>当前位置:Java大本营>Applet与Swing>文章内容
java swing的一个拖放例子
作者: 发布时间:2007-11-27 08:56:01
我从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] 下一页

· 看一下enum的原理(10-29)
· 我的spring入门级理解(09-02)
· SWT树节点上弹出菜单的实现 (02-05)
·基于 JSF+Spring + JPA 构建敏捷的Web(01-31)
·在SWING 的 JFileChooser中俘获返回的(01-20)
·SWT中设置TableViewer和TreeViewer为双(01-19)
·Spring之特殊字符转义和方法入参检测工(01-15)
·spring2.5 + hibernate3.2x 标注(annot(01-13)
·spring2.5 + hibernate3.2x 标注(annot(01-13)
·SWT中的FormLayout (01-10)
·Spring基础(01-10)
·Spring 让 LOB 数据操作简单化 (12-26)
复制地址发给您的好友: [推荐文章] [返回顶部] [关闭窗口]
版权所有 Java大本营 1999-2007 转载请注明出处