当然 - 请记住,所有 GwtEvent 对象都是完全人为的,并且基于从本机 JavaScript 触发的事件。该 JavaScript 事件对象(通过 via 传入onBrowserEvent
)根据原始对象的详细信息被包装为 aClickEvent
或 a ,然后通过内部实例KeyDownEvent
触发。HandlerManager
同样,你可以监听 a MouseDownEvent
,设置一些状态,然后如果 aMouseMoveEvent
发生,触发你自己的CanvasDrag
事件。一旦 a 发生,您可能会停止收听这些移动事件MouseUpEvent
,然后您会发出类似CanvasDropEvent
. 如果不是立即MouseUpEvent
发生而没有移动,您可以触发一个CanvasSelectEvent
(或者您可能对该选择事件有其他想法)。
您随后声明的这些新事件类型中的每一个都可能包含有关正在发生的任何事情的细节。例如,虽然 MouseMoveEvent 仅具有鼠标悬停的元素和 x/y 坐标,但您可能指示在页面周围拖动的内容。这可能是最后一次单击的形状,甚至是它所代表的数据。
是的,“发件人”或来源已经存在,但如果您公开某种方法来添加处理程序等addCanvasDragHandler
,它会更容易使用。这不是必需的 - 您的代码的所有用户都可以使用addHandler
,但它确实使小部件是否支持相关事件变得有点模棱两可。然后,您将调用fireEvent
画布对象以使该事件类型的所有处理程序都侦听。
或者,您可以创建一个包含内部Canvas
小部件的新类 - 可能是一个Composite
对象或只是实现的东西IsWidget
(Canvas 有一个私有构造函数,因此您不能对其进行子类化)。这将使您能够添加自己的特定处理程序,并保留自己的 HandlerManager/EventBus 来跟踪您关注的事件。