关于SWT DND操作的用途及触发方式的技术咨询
关于SWT DND操作的用途及触发方式的技术咨询
1. 关于DND操作作为协议而非OS直接实现效果的理解
你理解的完全没错!SWT里的DragSource和DropTarget构造时传入的DND操作(比如DND.DROP_COPY、DND.DROP_MOVE)确实更像是一种协商协议,而非像Control的style那样由OS直接处理视觉或行为效果。
操作系统的角色只是帮你传递这个操作标识,告诉双方“当前协商的是哪种拖拽类型”,但具体的业务逻辑——比如DROP_MOVE时需要删除源控件的数据、DROP_COPY时保留源数据并复制到目标——完全需要你自己在监听器里实现:
- 对于移动操作:在
DragSourceListener.dragFinished(DragSourceEvent)中处理源数据的删除,同时在DropTargetListener.drop(DropTargetEvent)中把数据添加到目标位置 - 对于复制操作:只需要在
drop方法中复制数据,源数据保持不变 - 对于链接操作:则需要创建源数据的引用(而非实际复制内容),具体逻辑根据你的业务场景定义
2. 如何触发指定的DND操作
默认情况下,SWT会根据系统的修饰键映射来设置event.detail:
- 无修饰键拖拽:默认是
DND.DROP_DEFAULT(通常会 fallback 到DragSource支持的第一个操作,比如你设置的DROP_MOVE) - 不同系统的修饰键映射可能略有差异,但通常:
Ctrl + 拖拽对应DND.DROP_COPYShift + 拖拽对应DND.DROP_MOVEAlt + 拖拽对应DND.DROP_LINK
如果想要自定义触发逻辑,或者直接指定某个操作,可以在监听器中手动设置event.detail的值,前提是该操作已经包含在DragSource和DropTarget构造时的operations参数中(也就是你代码里的DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK)。
举个例子,在DropTargetListener.dragEnter或dragOver方法中,根据修饰键手动指定操作:
@Override public void dragOver(DropTargetEvent event) { // 根据修饰键设置对应的操作 if ((event.stateMask & SWT.CTRL) != 0) { event.detail = DND.DROP_COPY; } else if ((event.stateMask & SWT.ALT) != 0) { event.detail = DND.DROP_LINK; } else if ((event.stateMask & SWT.SHIFT) != 0) { event.detail = DND.DROP_MOVE; } else { // 无修饰键时默认触发COPY(根据你的需求调整) event.detail = DND.DROP_COPY; } }
如果想完全不需要修饰键直接触发某个操作,也可以直接在dragEnter里硬设置event.detail = DND.DROP_COPY;,只要该操作在双方支持的operations列表中即可。
备注:内容来源于stack exchange,提问作者Bourbon_7
相关产品推荐
相关产品推荐

