Eclipse 开发插件 自定义 拖拽

本文介绍如何在Eclipse中实现自定义的拖拽功能,包括定义拖拽源、目标对象、传输对象等关键步骤,并提供从Tree控件拖拽数据到Table控件的具体示例。

 

    

一、写此篇文章的源由

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

记录完毕!

以上使用很简单,有不明白如何操作之处可以留言,看到会第一时间回复!

以上内容为原创,禁止转载,谢谢。

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值