使用鼠标钩子比较方便
1:在拖动开始的时候打开钩子
2:鼠标钩子监听鼠标松开的时候,传文件路径
3:拖动完成之后关闭鼠标钩子
缺点: 不能跨平台
前提:
org.eclipse.swt.win32.win32.x86_3.5.0.v3550b.jar(eclipse自带)
org.sf.feeling.swt.win32.extension_1.1.0.jar(需要下载)
DragSource datasource = new DragSource(tree, DND.DROP_MOVE | DND.DROP_COPY); // tree: org.eclipse.swt.widgets.Tree
datasource.setTransfer(new Transfer[] { FileTransfer.getInstance()});
datasource.addDragListener(new DragSourceListener() {
private HookListener hookListener;
private String[] paths;
public void dragStart(DragSourceEvent event) {
TreeItem selection = tree.getSelection()[0];
if (selection.getText().length() == 0) {
event.doit = false;
}
Hook.MOUSE.install("File");
hookListener = new HookListener();
Hook.MOUSE.addListener("File", hookListener);
}
public void dragSetData(DragSourceEvent event) {
if (hookListener.getHookFlag() == HookListener.L_RELEASE) {
event.doit = true;
if (paths == null || paths.length == 0) {
paths = getSelectPaths();
}
event.data = paths;
} else {
event.doit = false;
}
}
public void dragFinished(DragSourceEvent event) {
Hook.MOUSE.removeListener("File", hookListener);
Hook.MOUSE.uninstall("File");
paths = null;
}
}
// 内部类
class HookListener implements HookEventListener {
private int hookFlag = -1;
private final static int L_RELEASE = 10;
public void acceptHookData(HookData hookData) {
if (hookData != null) {
}
if (hookData.getWParam() == 514) { // 鼠标松开时候触发
hookFlag = L_RELEASE;
}
}
public int getHookFlag() {
return hookFlag;
}
}