gpt4 book ai didi

events - GWT 自定义事件

转载 作者:行者123 更新时间:2023-12-02 11:31:18 26 4
gpt4 key购买 nike

嘿,我在理解自定义 GWT 事件处理程序的工作方式时遇到了问题。我已经阅读了很多关于该主题的内容,但它仍然有些模糊。我已经在 Stackoverflow 上阅读过类似这样的主题 GWT Custom Event Handler .有人可以用如下的应用程序来解释它。

我有 2 个类(class),一个街区和一个男人类。当人与块碰撞时,人会触发一个事件( onCollision() ),然后块类会监听该事件。

谢谢

最佳答案

一般事件:

事件总是被发送来通知一些事情(例如状态的变化)。让我们以一个人和一堵墙为例。在这里我们可以想象有一个游戏,用户可以像人一样在迷宫中行走。每次用户撞到墙壁时,都应该将碰撞通知给它,以便它可以对其使用react(例如,墙壁可以将自己渲染为被破坏的墙壁)。这可以通过每次检测到与墙壁的碰撞时发送碰撞事件来实现。这个事件是由一个人发送的,系统中对这个事件感兴趣的每个对象都会收到它,并可以对它做出相应的 react 。想要接收事件的对象必须将自己注册为对事件感兴趣。

这就是事件在每个系统或框架中的一般工作方式(不仅在 GWT 中)。为了在此类系统中发送和接收事件,您必须定义:

  • 发送了什么(事件是什么样的)
  • 谁接收事件(事件接收者)
  • 谁发送事件(事件发送者)

  • 然后你可以:
  • 注册想要接收事件的事件接收器
  • 发送事件

  • GWT 中的事件:

    这里我将展示一个在 GWT 中使用自定义事件的示例。我将使用一个系统示例,该系统负责检查邮箱并通知用户是否有新邮件。让我们假设系统中至少有 2 个组件:
  • 邮件检查器负责检查邮箱和
  • 负责显示新邮件的消息显示器

  • 消息检查器在收到新邮件时发送事件,消息显示器接收到这些事件。

    步骤 1:定义事件

    有关新邮件的信息将作为 MessageReceivedEvent 的实例发送类(class)。该类包含一封新邮件(为简单起见,我们假设它只是一个 String )。

    该类的完整源代码如下(注释在源代码下方)。
    public class MessageReceivedEvent extends GwtEvent<MessageReceivedEventHandler> {

    public static Type<MessageReceivedEventHandler> TYPE = new Type<MessageReceivedEventHandler>();

    private final String message;

    public MessageReceivedEvent(String message) {
    this.message = message;
    }

    @Override
    public Type<MessageReceivedEventHandler> getAssociatedType() {
    return TYPE;
    }

    @Override
    protected void dispatch(MessageReceivedEventHandler handler) {
    handler.onMessageReceived(this);
    }

    public String getMessage() {
    return message;
    }
    }
    MessageReceivedEventHandler是表示事件接收器的接口(interface)。暂时不要管它,这将在稍后讨论。

    每个代表 GWT 事件的类都必须扩展 GwtEvent类(class)。这个类包含两个必须实现的抽象方法: getAssociatedTypedispatch .然而,在每个事件类中,它们通常以非常相似的方式实现。

    该类存储有关接收到的消息的信息(请参阅构造函数)。每个事件接收器都可以使用 getMessage 获取它方法。

    步骤 2:定义事件接收器

    GWT 中的每个事件类型都与一个接口(interface)相关联,该接口(interface)代表该事件类型的接收者。在 GWT 中,接收器称为处理程序。在示例中 MessageReceivedEvent 的事件接收器接口(interface)将命名为 MessageReceivedEventHandler .源代码如下:
    public interface MessageReceivedEventHandler extends EventHandler {
    void onMessageReceived(MessageReceivedEvent event);
    }

    每个处理程序必须扩展 EventHandler界面。它还应该定义一个在事件发生时将被调用的方法(它应该至少有一个参数 - 一个事件)。这里的方法名为 onMessageReceived .每个接收器都可以通过实现此方法对事件使用react。

    示例中唯一的事件接收器是 MessageDisplayer成分:
    public class MessageDisplayer implements MessageReceivedEventHandler {

    @Override
    public void onMessageReceived(MessageReceivedEvent event) {
    String newMessage = event.getMessage();
    // display a new message
    // ...
    }

    }

    第 3 步:定义事件发送者

    在这个例子中,唯一的事件发送者是一个负责检查邮件的组件 - EventChecker :
    public class MessageChecker implements HasHandlers {

    private HandlerManager handlerManager;

    public MessageChecker() {
    handlerManager = new HandlerManager(this);
    }

    @Override
    public void fireEvent(GwtEvent<?> event) {
    handlerManager.fireEvent(event);
    }

    public HandlerRegistration addMessageReceivedEventHandler(
    MessageReceivedEventHandler handler) {
    return handlerManager.addHandler(MessageReceivedEvent.TYPE, handler);
    }

    }

    每个事件发送者都必须实现 HasHandlers界面。

    这里最重要的元素是 HandlerManager field 。在 GWT HandlerManager顾名思义,管理事件处理程序(事件接收器)。正如开头所说,每个想要接收事件的事件接收器都必须将自己注册为感兴趣的。这就是处理程序管理器的用途。它们使注册事件处理程序成为可能,并且可以将特定事件发送到每个注册的事件处理程序。

    HanlderManager创建它在其构造函数中接受一个参数。每个事件都有一个来源,并且此参数将用作此处理程序管理器发送的所有事件的来源。在示例中它是 this作为事件的来源是 MessageChecker .

    方法 fireEventHasHandlers 中定义接口(interface),负责发送事件。如您所见,它仅使用处理程序管理器来发送(触发)和事件。
    addMessageReceivedEventHandler被事件接收者用来将自己注册为对接收事件感兴趣。再次处理程序管理器用于此。

    第 4 步:将事件接收者与事件发送者绑定(bind)

    当一切都被定义时,事件接收者必须在事件发送者中注册自己。这通常在创建对象期间完成:
    MessageChecker checker = new MessageChecker();
    MessageDisplayer displayer = new MessageDisplayer();
    checker.addMessageReceivedEventHandler(displayer);

    现在所有由 checker 发送的事件将由 displayer 收到.

    第 5 步:发送事件

    要发送事件, MessageChecker必须创建一个事件实例并使用 fireEvent 发送它方法。这手杖可以在 newMailReceived 中完成方法:
    public class MessageChecker implements HasHandlers {

    // ... not important stuff omitted

    public void newMailReceived() {
    String mail = ""; // get a new mail from mailbox
    MessageReceivedEvent event = new MessageReceivedEvent(mail);
    fireEvent(event);
    }

    }

    我希望它很清楚并且会有所帮助:)

    关于events - GWT 自定义事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2951621/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com