我想知道如何使用EventBus
或者是否有更好的解决方案可以通过项目发送Event
。
Widget1
有一个 Button
。 Widget2
有一个 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/