1

Gwt HTML5 Canvas 包装器可以响应鼠标和键盘事件,它绑定到 5 - 6 种不同的事件,我的问题是,可以定义全新的事件系统,例如 CanvasEvent (以及相关的处理程序 CanvasEventHandler 扩展到 GwtEvent 等),将此绑定到画布对象,然后使用处理程序接口方法以不同方式处理所有事件,例如 onDraw()、onDrag()、onMove()、onSelect() 等。

我对 GWT 事件系统不太清楚,但我想知道这是否可能在没有个性附加单独的事件处理程序以形成处理我的问题的逻辑的情况下,我可以将所有可能的事件作为一个合并对象访问并根据条件触发自定义事件。最好的方法是什么,有 GWT 自定义事件的线程,但它们包括发件人,而在我的情况下,发件人已经存在(画布)

非常感谢

4

1 回答 1

2

当然 - 请记住,所有 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 来跟踪您关注的事件。

于 2013-04-13T06:08:05.123 回答