Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 区分多个连接的gwt小部件的事件_Java_Gwt_Event Handling - Fatal编程技术网

Java 区分多个连接的gwt小部件的事件

Java 区分多个连接的gwt小部件的事件,java,gwt,event-handling,Java,Gwt,Event Handling,我一直试图让多个演讲者“聆听”同一个事件,但我想让每个事件对演讲者来说都是独一无二的 前。 我在一个不同的选项卡中创建了3个组合小部件。它们在绑定时都附加到同一事件。让我们称之为“新处方事件”。如果此事件被触发,我的3个组合将尝试执行此任务。我只想让他们中的一个去做 我找到的唯一方法是创建一个临时事件id(事件中的一个整数),检查每个试图响应事件的小部件 代码片段 private class OnNewPrescription implements NewPrescriptionHandler

我一直试图让多个演讲者“聆听”同一个事件,但我想让每个事件对演讲者来说都是独一无二的

前。 我在一个不同的选项卡中创建了3个组合小部件。它们在绑定时都附加到同一事件。让我们称之为“新处方事件”。如果此事件被触发,我的3个组合将尝试执行此任务。我只想让他们中的一个去做

我找到的唯一方法是创建一个临时事件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;
    }
}
public类NewPrescriptionEvent扩展了GwtEvent{
public static final GwtEvent.Type Type=new GwtEvent.Type();
私有int-dataObjectId;
public NewPrescriptionEvent(int-dataObjectId){
this.dataObjectId=dataObjectId;
}
@凌驾
受保护的无效分派(NewPrescriptionHandler){
handler.onNewPrescription(这是dataObjectId);
}
@凌驾
public GwtEvent.Type getAssociatedType(){
返回类型;
}
}
我在想,每一次的类型都应该不同,但仍然是相同的事件。有人有什么建议吗


Thx.

我想问题的标题是你的答案


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

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

如果您知道要侦听的源,您可以尝试使用


另一种可能是扩展
EventBus
,在注册时接受某种过滤器。

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

在没有共享的
EventBus
的情况下,异步事件处理的一组好规则是:

  • 通过直接方法调用与子部件通信
  • 通过回调/处理程序/侦听器与父小部件通信
  • 避免直接了解兄弟小部件(可能与这里的要点无关)
因此,包含3个选项卡的小部件可以将回调附加到每个选项卡上,当调用这些选项卡时,会将每个事件分派给相应的事件处理程序(我相信在您的情况下是演示者)

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

草图:

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);
          }
        });
    ...
  }
}
你甚至可以通过一些循环和配对来简化它

反过来说,这个容器也可以使用相同的原则,以另一种方式将事件发送回您的小部件


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

您正在使用事件系统“安排”客户端处理吗?如果您只需要处理事件,请创建另一个只侦听触发处理的事件的小部件。如果将事件处理程序添加到不应该处理事件的小部件中,则会出现一些奇怪的情况。也许您需要更多的事件类型,或者其他什么。如果您要使用同一个事件,并且只希望三个处理程序中的一个实际执行某些操作,那么使用随事件传递的变量将起作用。不过,您的示例代码似乎有些混乱。您是在寻找其他解决此问题的建议,还是希望得到帮助来修复代码?假设断言是正确的,这是正确的答案:同一小部件类型的多个实例。