java - 如何使用 GWT EventBus

标签 java events gwt event-handling

我想知道如何使用EventBus或者是否有更好的解决方案可以通过项目发送Event

Widget1 有一个 ButtonWidget2 有一个 Label,当我按下按钮时它应该会改变。这些小部件位于 DockLayout 中:

RootLayoutPanel rootLayoutPanel = RootLayoutPanel.get();
DockLayoutPanel dock = new DockLayoutPanel(Unit.EM);

dock.addWest(new Widget1(), 10);
dock.add(new Widget2());

rootLayoutPanel.add(dock);

我在 Widget1 中声明了一个 handleClickAlert:

@UiHandler("button")
void handleClickAlert(ClickEvent e) {
    //fireEvent(e); 
}

最佳答案

当您将项目划分为逻辑部分(例如使用 MVP)时,不同的部分有时需要进行通信。典型的这种通信是通过发送状态变化来完成的,例如:

  • 用户登录/注销。
  • 用户通过 URL 直接导航到页面,因此需要更新菜单。

在这些情况下使用事件总线是很合乎逻辑的。

要使用它,您需要为每个应用实例化一个 EventBus,然后由所有其他类使用。要实现这一点,请使用静态字段、工厂或依赖注入(inject)(在 GWT 的情况下为 GIN)。

以您自己的事件类型为例:

public class AppUtils{

    public static EventBus EVENT_BUS = GWT.create(SimpleEventBus.class);
}

通常您还会创建自己的事件类型和处理程序:

public class AuthenticationEvent extends GwtEvent<AuthenticationEventHandler> {

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

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

@Override
protected void dispatch(AuthenticationEventHandler handler) {
    handler.onAuthenticationChanged(this);
}
}

和处理程序:

public interface AuthenticationEventHandler extends EventHandler {
    void onAuthenticationChanged(AuthenticationEvent authenticationEvent);
}

然后你这样使用它:

AppUtils.EVENT_BUS.addHandler(AuthenticationEvent.TYPE, new AuthenticationEventHandler()     {
        @Override
        public void onAuthenticationChanged(AuthenticationEvent authenticationEvent) {
            // authentication changed - do something
        }
    });

并触发事件:

AppUtils.EVENT_BUS.fireEvent(new AuthenticationEvent());

关于java - 如何使用 GWT EventBus,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6030202/

相关文章:

java - Facebook 集成应用程序可以在模拟器中完美运行,但不能在 Android 设备上运行

database - 在cakephp 2.x甚至函数中将数据保存在数据库中

jQuery 无需点击即可触发点击事件

java - 使用 UIBinder 创建一个进入对话框的 Widget

java - GWT 即时编译

java - 如何清理 gwt CellList?

java - 如何使用 NIO 从 gzip 文本文件中逐行读取文本数据?

java - 自定义帐户存储库如何成为一个没有任何注释的 bean?

javascript - 使用JavaScript(ES5)的简单事件系统-JS自定义事件

java - 增加 JSpinner 上箭头的大小