一、写此篇文章的源由
1、方便更多人快速实现Eclipse的自定义拖拽功能。
2、目前网络上对Eclipse自定义拖拽功能资料胜少,有些不全,以补充记录知识点。
二、实现拖拽需要理解几个要素
1、拖拽源(DragSource):被拖拽的对象
2、目标对象(DrogTarget):接受拖拽对象的对象
3、传输对象(Transfer):拖拽源到目标对象之间的传输载体
4、拖拽源监听(DragSourceListener):监听对象是否发生了拖拽事件
5、目标对象监听(DragSourceListener):监听对象是否发生了拖拽释放事件,并处理拖拽释放的逻辑
三、实现自定义拖拽功能
以下示例是从Tree控件拖拽到Table控件
1、相关类的定义:
/**
* 第一步:定义拖拽源dragSource
*/
public class BaseDragSource implements DragSourceListener{
@Override
public void dragStart(DragSourceEvent event) {
super.dragEnter(event);
super.dragStart(event);
if(tree.getFirstSelectedItem() instanceof IBaseVo) {//此处的IBaseVo为当前tree被选中的数据实体类对象
event.doit = true;
}else {
event.doit = false;
}
}
@Override
public void dragSetData(DragSourceEvent event) {
// TODO Auto-generated method stub
}
@Override
public void dragFinished(DragSourceEvent event) {
super.dragSetData(event);
event.data = tree.getFirstSelectedItem();
}
}
/** 第二步:定义拖拽释放目的地dropTarget
*/
public abstract class BaseDropTarget implements DropTargetListener {
@Override
public void dragEnter(DropTargetEvent event) {
// TODO Auto-generated method stub
}
@Override
public void dragLeave(DropTargetEvent event) {
// TODO Auto-generated method stub
}
@Override
public void dragOperationChanged(DropTargetEvent event) {
// TODO Auto-generated method stub
}
@Override
public void dragOver(DropTargetEvent event) {
// TODO Auto-generated method stub
}
@Override
public void drop(DropTargetEvent event) {
Object data = event.data;//此data即为拖入的数据对象,接着进行业务逻辑处理即可
}
@Override
public void dropAccept(DropTargetEvent event) {
// TODO Auto-generated method stub
}
}
/**
*第三步:定义传输对象
*/
public abstract class BaseVoTransfer extends BaseTransfer {
protected static BaseVoTransfer INSTANCE = null;
private static final String TYPE_NAME = "locat-selection-custom-basevo-format"; //$NON-NLS-1$;
private static final int TYPEID = registerType(TYPE_NAME);
@Override
protected int[] getTypeIds() {
return new int[] { TYPEID };
}
@Override
protected String[] getTypeNames() {
return new String[] { TYPE_NAME };
}
@Override
protected boolean validate(Object object) {
return (object != null && object instanceof IBaseVo);
}
@Override
protected void javaToNative(Object object, TransferData transferData) {
if(object == null) return;
super.javaToNative(objectToByteArray(object), transferData);
}
@Override
protected Object nativeToJava(TransferData transferData) {
byte[] bytes = (byte[]) super.nativeToJava(transferData);
if (bytes == null) {
return null;
}
return byteArrayToObject(bytes);
}
/**
* 对象转对象字节数组
* @param obj
* @return
*/
public byte[] objectToByteArray(Object obj) {
byte[] bytes = null;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(obj);
oos.flush();
bytes = bos.toByteArray();
oos.close();
bos.close();
} catch (IOException ex) {
ex.printStackTrace();
}
return bytes;
}
/**
* 对象字节数据转对象
* @param bytes
* @return
*/
public Object byteArrayToObject (byte[] bytes) {
Object obj = null;
try {
ByteArrayInputStream bis = new ByteArrayInputStream (bytes);
ObjectInputStream ois = new ObjectInputStream (bis);
obj = ois.readObject();
ois.close();
bis.close();
} catch (IOException ex) {
ex.printStackTrace();
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
return obj;
}
}
/**
* 拖拽传输对象transfer抽象类
* 说明:ByteArrayTransfer此类为来源org.eclipse.swt.dnd.ByteArrayTransfer
*/
public abstract class BaseTransfer extends ByteArrayTransfer{
@Override
public TransferData[] getSupportedTypes() {
// TODO Auto-generated method stub
return super.getSupportedTypes();
}
@Override
public boolean isSupportedType(TransferData transferData) {
// TODO Auto-generated method stub
return super.isSupportedType(transferData);
}
@Override
protected int[] getTypeIds() {
// TODO Auto-generated method stub
return null;
}
@Override
protected String[] getTypeNames() {
// TODO Auto-generated method stub
return null;
}
@Override
protected void javaToNative(Object object, TransferData transferData) {
// TODO Auto-generated method stub
super.javaToNative(object, transferData);
}
@Override
protected Object nativeToJava(TransferData transferData) {
// TODO Auto-generated method stub
return super.nativeToJava(transferData);
}
}
2、使用姿势:
//添加拖动支持
DragSource dragSource = new DragSource(tree.getViewer().getControl(), DND.DROP_MOVE|DND.DROP_COPY);
dragSource.setTransfer(new Transfer[] {BaseVoTransfer.getInstance()});
dragSource.addDragListener(new BaseDragSource());
//添加拖入支持
DropTarget dropTarget = new DropTarget(table, DND.DROP_MOVE|DND.DROP_DEFAULT|DND.DROP_COPY);
dropTarget.setTransfer(new Transfer[] {BaseVoTransfer.getInstance()});
dropTarget.addDropListener(new BaseDropTarget());
记录完毕!
以上使用很简单,有不明白如何操作之处可以留言,看到会第一时间回复!
以上内容为原创,禁止转载,谢谢。