我是GWT的新手。
我在两个不同的面板(精确地称为ListBox
和A
,如果有的话,有两个B
元素(我们分别称为Composite
和VerticalPanel
);我们将它们称为panelA
和panelB
)具有共同父母(parentPanel
)。
我想在A
更改时更新B
中的项目列表。
如何在GWT中做到这一点?
我的第一个想法是将changeHandler
添加到B
,在其中我在updateItems()
上调用一些公共A
方法。
但是,根本无法从panelA
访问panelB
。更糟糕的是,A
是panelA
的私有内部类。
我可能可以公开所有这些类/方法等,以使它起作用,但是我觉得这不是正确的方法。
我的设计不好吗?在GWT中做这些事情的正确方法是什么?我想我只是缺少一个关键词来开始研究...
任何帮助将不胜感激。不要求代码,只是一般概念或建议。
最佳答案
使用Eventbus
创建事件
public class ListBoxBEvent extends GwtEvent<ListBoxBChanged.Handler> {
public interface Handler extends EventHandler {
void onListBoxBChanged(ListBoxBEvent listBoxBEvent);
}
public static final GwtEvent.Type<Handler> TYPE = new GwtEvent.Type<Handler>();
private Object selectedObject;
public VueChangedEvent(Object selectedObject) {
this.selectedObject=selectedObject;
}
@Override
public GwtEvent.Type<Handler> getAssociatedType() {
return TYPE;
}
@Override
protected void dispatch(Handler handler) {
handler.onListBoxBChanged(this);
}
public static HandlerRegistration register(EventBus eventBus, Handler handler) {
return eventBus.addHandler(TYPE, handler);
}
public Object getSelectedObject(){
return selectedObject;
}
}
在具有ListBoxA的panelA中,按以下方式注册该事件
ListBoxBEvent.register(eventBus, new ListBoxBEvent.Handler() {
@Override
public void onListBoxBChanged (ListBoxBEvent listBoxBEvent) {
Object seletetObject = listBoxBEvent.getSelectedObject();
updateListBoxB(seletetObject);
}
});
在
OnChange
的ListBoxB
事件中,您触发ListBoxBEvent
view.getListBoxB().addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
eventBus.fireEvent(new ListBoxBEvent(selectedObject));
}
});
确保使用Singleton或DI通过应用程序使用EventBus对象的一个实例