经过长时间的调查和阅读这个问题,我仍然没有为我的问题找到一个“好的”解决方案。
我有一个 Gef 编辑器,我想让用户将图形(== 模型对象)从这个编辑器拖放到我的视角中可用的其他自定义视图。
在我的 GEF 编辑器图形画布上添加带有我自己的拖动传输的 DragSource 允许这样做。但作为副作用,我不希望这种副作用,这禁用了使用拖放在编辑器内部移动图形的可能性。
经过调查,我在 eclipse 论坛上找到了这个帖子,但这个解决方案对我来说是不可接受的。因此,我进行了更深入的调查并得出了以下纯 SWT 片段,该片段显示一旦添加了拖动源,就不再触发 MouseMove 事件(gef 用于支持在编辑器内拖动的事件):
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSource;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.DragSourceListener;
import org.eclipse.swt.dnd.FileTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class SwtTest {
public static void main(String[] args) {
final Display display = new Display();
final Shell shell = new Shell(display);
shell.addMouseListener(new MouseListener() {
public void mouseUp(MouseEvent e) {
System.out.println("mouseUp");
}
public void mouseDown(MouseEvent e) {
System.out.println("mouseDown");
}
public void mouseDoubleClick(MouseEvent e) {
System.out.println("mouseDoubleClick");
}
});
shell.addMouseMoveListener(new MouseMoveListener() {
@Override
public void mouseMove(MouseEvent e) {
System.out.println("Mouse move");
}
});
DragSourceListener dragListener = new DragSourceListener() {
public void dragFinished(DragSourceEvent event) {
System.out.println("dragFinished");
}
public void dragSetData(DragSourceEvent event) {
System.out.println("dragSetData");
}
public void dragStart(DragSourceEvent event) {
System.out.println("dragStart");
}
};
DragSource dragSource = new DragSource(shell, DND.DROP_COPY | DND.DROP_MOVE);
dragSource.addDragListener(dragListener);
dragSource.setTransfer(new Transfer[] { FileTransfer.getInstance() });
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
我想这是从 man SWT 的角度来看的正常行为。你确认吗?
此外,我真的在寻找这个问题的解决方案,除了在 Eclipse 论坛上提出的一个解决方案,即只有在满足给定条件(例如按下 Shift)时才激活我的 DragSource(这是通过设置事件在 DragSourceListener.dragStart 方法中完成的.doit 为假)
欢迎任何帮助、建议和意见。
提前致谢,
马努