java拖动设计器_java-SWT小部件中的自定义拖动检测

在基于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)禁用该机制,否则自定义拖动检测将仅在内置检测之后运行,该检测会施加延迟,因为它阻止了事件线程,除了第二次检测到阻力外,当然.

标签:drag-and-drop,swt,java

来源: https://codeday.me/bug/20191208/2089395.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值