区分多个附加gwt小部件的事件

时间:2010-11-18 15:53:19

标签: java gwt event-handling

我一直在尝试让多个演示者“听”同一个事件,但我要使每个事件对于演示者都是独一无二的。

实施例。 我在一个不同的选项卡中创建3个复合小部件。他们在绑定时全部附加到同一事件。我们称之为“NewPrescriptionEvent”。如果此事件被触发,我的所有3个复合材料都将尝试 DO 作业。我只希望其中一个人这样做。

我发现这样做的唯一方法是创建一个临时事件id(事件中的一个整数),我会检查每个试图响应事件的小部件。

代码段

private class OnNewPrescription implements NewPrescriptionHandler {

    @Override
    public void onNewPrescription(NewPrescriptionEvent event, int dataObjectId) {

        if (getDataObject().getPatientId() == dataObjectId) {
        ...
        }
    }
}

在装订过程中,我会照常做到:

eventBus.addHandler(NewPrescriptionEvent.TYPE, new OnNewPrescription());

活动:

public class NewPrescriptionEvent extends GwtEvent<NewPrescriptionHandler> {

    public static final GwtEvent.Type<NewPrescriptionHandler> TYPE = new GwtEvent.Type<NewPrescriptionHandler>();

    private int dataObjectId;

    public NewPrescriptionEvent(int dataObjectId) {
        this.dataObjectId = dataObjectId; 
    }

    @Override
    protected void dispatch(NewPrescriptionHandler handler) {
        handler.onNewPrescription(this, dataObjectId);      
    }

    @Override
    public GwtEvent.Type<NewPrescriptionHandler> getAssociatedType() {
        return TYPE;
    }
}

我当时认为TYPE每次都需要不同,但仍然是同一个事件。有没有人有建议?

THX。

4 个答案:

答案 0 :(得分:2)

您是否拥有相同演示者的任意数量的实例并且所有实例都在监听相同的事件类型?并且您的每个演示者“控制”一个不同的实体因此应该只对来自该实体的事件做出反应?如果是这种情况,我看到的唯一解决方案是像你一样参数化事件。

答案 1 :(得分:1)

听起来EventBus可能不是最好的方法;这是我个人对EventBus所遇到的主要问题之一:所有事件都是全局的,并且很难区分给定类型的不同事件。

没有共享EventBus的异步事件处理的一组良好规则是:

  • 通过直接方法调用与子小部件通信。
  • 通过回调/处理程序/侦听器与父窗口小部件通信。
  • 避免直接了解兄弟小部件(可能除此之外)

因此,包含3个选项卡的窗口小部件可以将回调附加到每个选项卡,在调用时,将每个事件调度到其相应的事件处理程序(在您的情况下,我认为是演示者)。

不需要全局通信,不了解源或目标,只有一种事件类型,一种可重用的选项卡窗口小部件类型,以及选项卡类保持简单。原则上,与将ValueChangeHandler添加到CheckBox没有什么不同(毕竟,人们不会通过事件总线订阅复选框事件,只需将处理程序直接添加到窗口小部件)。

粗略草图:

public class TabContainer implements IsWidget {
  public TabContainer() {
    tab1.addNewPrescriptionHandler(
        new NewPrescriptionEventHandler() {
          @Override
          public void handleNewPrescriptionEvent(NewPrescriptionEvent event) {
            handleTab1Event(event);
          }
        });
    tab2.addNewPrescriptionHandler(
        new NewPrescriptionEventHandler() {
          @Override
          public void handleNewPrescriptionEvent(NewPrescriptionEvent event) {
            handleTab2Event(event);
          }
        });
    ...
  }
}

你甚至可以通过一些循环和配对来简化它。

另一方面,此容器还可以使用相同的原则从其他任何地方将事件发送回您的小部件。

此外,根据Event类包含的内容,您甚至可能不需要Event类;你可以根据需要定义你的回调和参数。

答案 2 :(得分:0)

我认为问题的标题是你的答案。

每个小部件都需要不同的事件类型。

答案 3 :(得分:0)

如果您知道要收听的来源,则可以尝试使用addHandlerToSource(GwtEvent.Type<H> type, Object source, H handler)

另一种可能性是扩展EventBus以接受某种注册过滤器。