Events gwt画布-以完全不同的方式处理事件

Events gwt画布-以完全不同的方式处理事件,events,gwt,canvas,handler,Events,Gwt,Canvas,Handler,Gwt HTML5画布包装器可以响应鼠标和键盘事件,它绑定到5-6种不同类型的事件,我的问题是,可以定义全新的事件系统,例如CanvasEvent(以及相关的处理程序CanvasEventHandler扩展到GWteEvent等),将其绑定到画布对象,然后使用处理程序以不同方式处理所有事件。接口方法将类似于onDraw()、onDrag()、onMove()、onSelect()等 我不太清楚GWT事件系统,但我想知道,在不附加单独的事件处理程序以形成处理问题的逻辑的情况下,这是否可能,我是否可

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

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


非常感谢

当然-请记住,所有GwtEvent对象都是完全人工的,并且基于从本机JavaScript触发的事件。该JavaScript事件对象(通过
onBrowserEvent
进入)根据原始对象的详细信息包装为
ClickEvent
KeyDownEvent
,然后通过内部
HandlerManager
实例触发。同样,您可以监听
MouseDownEvent
,设置一些状态,然后如果发生
MouseMoveEvent
事件,则触发您自己的
CanvasDrag
事件。一旦发生
MouseUpEvent
事件,您可能会停止侦听这些移动事件,然后您会发出类似
CanvasDropEvent
的消息。如果isntead没有移动就立即发生了
MouseUpEvent
,则可以触发
CanvasSelectEvent
(或者您可能会为该选择事件考虑其他事项)

然后,您声明的每个新事件类型都可能包含有关正在发生的事情的详细信息。例如,虽然MouseMoveEvent只有鼠标所在的元素和x/y坐标,但您可能在指示在页面上拖动的内容。这可能是最后一次单击的形状,甚至是它所表示的数据的形式

是的,“发件人”或源代码已经存在,但是如果您公开某种方法来添加处理程序,例如
addCanvasDragHandler
,则使用起来会更容易。这不是必需的-您代码的所有用户都可以使用
addHandler
,但它确实使小部件是否支持所讨论的事件变得有点模棱两可。然后在画布对象上调用
fireEvent
,使该事件类型的所有处理程序都侦听


或者,您可以创建一个包含内部
Canvas
小部件的新类-可能是一个
Composite
对象,或者只是实现
IsWidget
的对象(Canvas有一个私有构造函数,所以您不能将其子类化)。这将使您能够添加自己的特定处理程序,并保留自己的HandlerManager/EventBus来跟踪您所关注的事件。

这很有效!,要触发复杂事件,必须实现这些简单的处理程序以并行运行。LOL我的整个代码都被包装在一个类“public class CanvasEvent extensed GwtEvent implements MouseDownHandler、MouseMoveHandler、mousephundler”中,这是一个很小的诡辩,但请记住,GWT中没有“并行”功能——浏览器中的所有代码都在一个线程中运行。您可以一个接一个地启动多个事件,但每个事件都将在下一个事件启动之前完成其全部过程。这就是浏览器中JavaScript虚拟机的本质。不过,您应该或多或少地将其视为并行代码——这将鼓励您编写更多异步(也称为非阻塞)代码,从而为用户带来更具响应性的体验。哦,是的,“javascript的旧单线程说法”,我将记住这一点。