如何使用GWT EventBus

时间:2011-05-17 11:38:05

标签: 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);

handleClickAlert

我在Widget1声明了@UiHandler("button") void handleClickAlert(ClickEvent e) { //fireEvent(e); }

{{1}}

1 个答案:

答案 0 :(得分:105)

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

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

在这些情况下,使用事件总线是非常合理的。

要使用它,您需要为每个应用程序实例化一个EventBus,然后由所有其他类使用。要实现这一点,请使用静态字段,工厂或依赖注入(在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());