在基于SWT的应用程序中,我有一个Canvas派生的自定义小部件,它显示了一堆“项目”.这些项目的全部目的是让用户将其拖出小部件.我毫不费力地实现了DragSource,DragDetectListener和所有使DND正常工作的东西.我要解决的问题是,我希望比默认平台行为更早地检测到拖动,即在鼠标拖动距离短得多之后.
我知道我可以重写Widget类的dragDetect().但是,这只允许我否决超类的实现,而不是通知超类认为已经发生拖累.
基本上,如果我可以自己生成拖动事件,就像我可以只使用Widget.postEvent(SWT.DragDetect,eventWhichIAllocatedAndFilledOut)(包私有)一样,那似乎就是我的解决方案.我已经看过Widget中用于拖动检测的代码,而且它似乎并非针对此用例而设计.有什么解决方法可以让我随时随地启动拖动?
解决方法:
我已经知道了.可以生成一个自定义事件,并将其分发到DragDetect侦听器机制.下面的代码与内部实现相同,但是可以在Widget实现中随意调用,例如,从MouseMoveListener的mouseMove(MouseEvent e)挂钩中进行调用:
Event event = new Event();
event.type = SWT.DragDetect;
event.display = getDisplay();
event.widget = this;
event.button = e.button;
event.stateMask = e.stateMask;
event.time = e.time;
event.x = e.x;
event.y = e.y;
notifyListeners(SWT.DragDetect, event);
值得注意的是,必须禁用内置的拖拽检测功能才能使其按预期工作.默认实现是通过dragDetect(MouseEvent e)方法公开的,可以从mouseDown()处理程序调用该方法(如dragDetect()的文档中所述).它通过忙循环事件线程直到检测到拖动来工作.它仅消耗GTK后端上本机事件队列中的鼠标移动事件.当DragDetectListener向Widget注册时,这将自动完成,因此,除非通过setDragDetect(false)禁用该机制,否则自定义拖动检测将仅在内置检测之后运行,该检测会施加延迟,因为它阻止了事件线程,除了第二次检测到阻力外,当然.