RCP:拖拽功能的实现 Drag and Drop
SWT中的拖拽是使用的org.eclipse.swt.dnd。
有三个需要密切注意的类:
1、DragSource
2、DropTarget
3、Transfer
DragSource封装了需要被拖拽的Control
DropTarget封装了拖拽的目标Control,即是拖拽终点的容器
Transfer是一个转换器,用于Java表示和平台指定的数据之间的相互转换
根据以上,我们可以揣测:
1、只有被DragSource封装了的Control对象才能被拖拽
2、只有被DropTarget封装了的Control对象才能被放置拖拽对象
3、同一次操作中,DragSource和DropTarget所定义的Transfer必须匹配
了解了这些基础,我们来看一个例子(该示例来自网络):
package z_test_project;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.*;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*; public class DNDExample { public static void main(String[] args) {
Shell shell = new Shell();
shell.setBackground(new Color(null, 200, 200, 200));
shell.setLayout(new GridLayout(2, false)); // Create the tree and some tree items
final Tree tree = new Tree(shell, SWT.NONE);
TreeItem item1 = new TreeItem(tree, SWT.NONE);
item1.setText("Item 1");
TreeItem item2 = new TreeItem(tree, SWT.NONE);
item2.setText("Item 2"); // Create the drag source on the tree
DragSource ds = new DragSource(tree, DND.DROP_MOVE);
ds.setTransfer(new Transfer[] {TextTransfer.getInstance()});
ds.addDragListener(new DragSourceAdapter() {
public void dragSetData(DragSourceEvent event) {
// Set the data to be the first selected item's text
event.data = tree.getSelection()[0].getText();
}
}); // Create the text field
final Text text = new Text(shell, SWT.NONE); // Create the drop target on the text field
DropTarget dt = new DropTarget(text, DND.DROP_MOVE);
dt.setTransfer(new Transfer[] {TextTransfer.getInstance()});
dt.addDropListener(new DropTargetAdapter() {
public void drop(DropTargetEvent event) {
// Set the text field's text to the text being dropped
text.setText((String)event.data);
}
}); shell.pack();
shell.open();
Display display = Display.getDefault();
while (!shell.isDisposed())
if (!display.readAndDispatch())
display.sleep();
display.dispose();
}
}
效果如图:

这只是实现了简单的控件和控件之间的拖拽。
现在我们来实现两个功能,从导航器或者操作系统里向编辑器中拖拽。
首先是导航器,大部分导航器使用了TreeViewer展示,org.eclipse.jface.viewers.StructuredViewer#addDragSupport方法为TreeViewer的Control添加了DragSource
即是创建DragSource的步骤已经预先完成了。
题外:使用CNF生成的导航器必然会用到扩展点org.eclipse.ui.navigator.navigatorContent 其下有元素navigatorContent,其下又有元素dropAssitant 从命名可以看出,它指定的类是用来封装DropTarget和DropListener的 其内部实现有兴趣的自己阅读源码。 这部分是为了让导航器的内容可以在导航器内部拖拽。
然后我们写一个编辑器,使用一个Text填充,Text部分源码如下:
final Text text = new Text(composite, SWT.MULTI | SWT.BORDER);
text.setText("测试页1"); DropTarget dropTarget = new DropTarget(text, DND.DROP_MOVE
| DND.DROP_COPY | DND.DROP_LINK | DND.DROP_TARGET_MOVE); dropTarget.setTransfer(new Transfer[] {
LocalSelectionTransfer.getTransfer(),
FileTransfer.getInstance() });
dropTarget.addDropListener(new DropTargetAdapter() {
@Override
public void drop(DropTargetEvent event) {
text.setText(event.data == null ? null : event.data.toString());
}
});
注意红字部分,第一个LocalSelectionTransfer是为了让DropTarget能匹配导航器拖拽的部分内容,第二个FileTransfer是为了让其能匹配操作系统拖拽的文件。
以上即实现了拖拽功能。
这里提出一个问题,Text是如何识别到底一个拖拽进来的元素是否能够放置的呢?
这里,就需要看Transfer#validate的实现了。
如果被拖拽的元素能通过DropTarget所指定的任何一个Transfer的validate,就会被该Transfer所处理,然后转化为Java对象,应用到DropTarget封装的Control上去。
RCP:拖拽功能的实现 Drag and Drop的更多相关文章
- Atitit。D&D drag&drop拖拽功能c#.net java swing的对比与实现总结
Atitit.D&D drag&drop拖拽功能c#.net java swing的对比与实现总结 1. 实现一个D&D操作一般包括三个步骤: 1 2. .net黑头的拖曳机制 ...
- HTML5拖拽功能drag
1.创建拖拽对象 给需要拖拽的元素设置draggable属性,它有三个值: true:元素可以被拖拽:false:元素不能被拖拽:auto: 浏览器自己判断元素是否能被拖拽. 2.处理拖拽事件当我们拖 ...
- 使用UGUI实现拖拽功能(拼图小游戏)
实现方式 1.引入UGUI自带的事件系统 UnityEngine.EventSystems 2.为我们的类添加接口 IBeginDragHandler, IDragHandler, IEndDragH ...
- JQuery UI的拖拽功能
JQuery UI是JQuery官方支持的WebUI 代码库,包含底层交互.动画.特效等API,并且封装了一些Web小部件(Widget).同时,JQuery UI继承了jquery的插件支持,有大量 ...
- 关于 JS 拖拽功能的冲突问题及解决方法
前言 我在之前写过关于 JS 拖拽的文章,实现方式和网上能搜到的方法大致相同,别无二致,但是在一次偶然的测试中发现,这种绑定事件的方式可能会和其它的拖拽事件产生冲突,由此产生了对于事件绑定的思考.本文 ...
- Js元素拖拽功能实现
Js元素拖拽功能实现 需要解决的问题 最近项目遇到了一个问题,就是用户某个操作需要弹出一个自定义的内容输入框,但是有个缺点,当浏览太大的时候没办法点击确认和取消按钮,应为这个弹出框是采用绝对定位的,取 ...
- JQuery UI的拖拽功能实现方法小结
JQuery UI提供的API极大简化了拖拽功能的开发.只需要分别在拖拽源(source)和目标(target)上调用draggable和droppable两个函数即可. 拖拽原理 首先要明确几个概念 ...
- PCB Winform中的WebBrowser扩展拖放(拖拽)功能 实现方法
我们在Winform支持网页通常增加WebBrowser控件实现,相当于内嵌浏览器浏览网页使用, 而此WebBrowser默认情况是文件拖入功能是不支持的, 如何才能支持呢.在这里介绍如何实现方法 一 ...
- bcb ole拖拽功能的实现
最近项目中用到了OLE 拖拽功能 和BCB 一个Form的Drag 不同的是,只有实现了OLE 拖拽才能,从其他程序拖拽数据到Form 下面的代码实现了,同HTML网页拖拽到Form时,Form获得H ...
随机推荐
- linux 下进程通讯详解
linux 下进程通讯方法主要有以下六种: 1.管道 2.信号 3.共享内存 4.消息队列 5.信号量 6.socket
- Regular Expression Matching leetcode
递归方法运行时间过长.考虑使用动态规划的方法. 代码如下: bool isMatch(string s, string p) { int i,j; int m=s.size(); int n=p.si ...
- textField和textView限制输入条件
以下两法方法都是实现textfield和textView的代理方法 需要先遵循代理 一:textField限制只能输入数字和小数点 且小数点后只能保留两位 小数点前最多5位 - (BOOL)text ...
- linux服务器apache 一个IP,一个端口,建立多个网站的方法。
找到apache-tomcat-6.0.14\conf\server.xml ,再services 后面添加此段代码: Xml代码 <!-- 此处 新增的项目配置--> <Ser ...
- SQL Server2005索引碎片分析和解决方法
SQL Server2005索引碎片分析和解决方法 本文作者(郑贤娴),请您在阅读本文时尊重作者版权. 摘要: SQL Server,为了反应数据的更新,需要维护表上的索引,因而这些索引会形成碎片.根 ...
- OpenVPN 通过服务器上网
在Windows环境中架设OpenVPN服务相对比较简单,网上这方面的教程也比较丰富,照葫芦画瓢即可.但是大部分教程都只讲了如何将client与Server通过VPN管道连接起来,使client可以正 ...
- 猿团YTFCloud生态系统,全面服务创业者
9月15日,YTFCloud已正式开启了内测. 创业者翘首以待的YTFCloud,虽然让部分创业者感受到了它的神奇,但对于更多暂时无法尝试的创业者来说,它依然有一层神秘的面纱. 今天小编就来带你近距离 ...
- Java学习笔记 01 基本数据类型、标识符、关键字和运算符
一.基本数据类型 基本数据类型 数据类型 内存空间(8位等于1字节) 取值范围 备注 byte 8位 -128~127 short 16位 -32768~32767 int 32位 -2147 ...
- JavaScript的Ajax请求示例
//创建XMLHttpRequest对象 var request = false; try { request = new ...
- EditPlus 3.1
User:GNU Serial:918A8-20DD8-44ZA1-B0W4A-13T66