Java 区分多个连接的gwt小部件的事件
我一直试图让多个演讲者“聆听”同一个事件,但我想让每个事件对演讲者来说都是独一无二的 前。 我在一个不同的选项卡中创建了3个组合小部件。它们在绑定时都附加到同一事件。让我们称之为“新处方事件”。如果此事件被触发,我的3个组合将尝试执行此任务。我只想让他们中的一个去做 我找到的唯一方法是创建一个临时事件id(事件中的一个整数),检查每个试图响应事件的小部件 代码片段Java 区分多个连接的gwt小部件的事件,java,gwt,event-handling,Java,Gwt,Event Handling,我一直试图让多个演讲者“聆听”同一个事件,但我想让每个事件对演讲者来说都是独一无二的 前。 我在一个不同的选项卡中创建了3个组合小部件。它们在绑定时都附加到同一事件。让我们称之为“新处方事件”。如果此事件被触发,我的3个组合将尝试执行此任务。我只想让他们中的一个去做 我找到的唯一方法是创建一个临时事件id(事件中的一个整数),检查每个试图响应事件的小部件 代码片段 private class OnNewPrescription implements NewPrescriptionHandler
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
的情况下,异步事件处理的一组好规则是:
- 通过直接方法调用与子部件通信
- 通过回调/处理程序/侦听器与父小部件通信
- 避免直接了解兄弟小部件(可能与这里的要点无关)
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);
}
});
...
}
}
你甚至可以通过一些循环和配对来简化它
反过来说,这个容器也可以使用相同的原则,以另一种方式将事件发送回您的小部件
此外,根据
事件
类包含的内容,您甚至可能不需要事件
类;您可以根据需要定义回调和参数。您正在使用事件系统“安排”客户端处理吗?如果您只需要处理事件,请创建另一个只侦听触发处理的事件的小部件。如果将事件处理程序添加到不应该处理事件的小部件中,则会出现一些奇怪的情况。也许您需要更多的事件类型,或者其他什么。如果您要使用同一个事件,并且只希望三个处理程序中的一个实际执行某些操作,那么使用随事件传递的变量将起作用。不过,您的示例代码似乎有些混乱。您是在寻找其他解决此问题的建议,还是希望得到帮助来修复代码?假设断言是正确的,这是正确的答案:同一小部件类型的多个实例。