我是 GWT 新手。
我有两个 ListBox
元素(我们称它们为 A
和 B
),位于两个不同的面板(确切地说是 Composite
) > 和 VerticalPanel
(如果重要的话);我们称它们为 panelA
和 panelB
),它们有一个共同的父级 (parentPanel
) .
当 B
更改时,我想更新 A
中的项目列表。
如何在 GWT 中执行此操作?
我的第一个想法是将 changeHandler
添加到 B
,其中我在 A
上调用一些公共(public) updateItems()
方法。
然而,panelA
根本无法从 panelB
访问。更糟糕的是,A
是 panelA
的私有(private)内部类。
我可能可以将所有这些类/方法等公开以使其正常工作,但我觉得这不是正确的方法。
我的设计不好吗?在 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);
}
});
在 ListBoxB
的 OnChange
事件中,您触发 ListBoxBEvent
view.getListBoxB().addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
eventBus.fireEvent(new ListBoxBEvent(selectedObject));
}
});
确保您使用 Singleton 或 DI 通过应用程序使用 EventBus 对象的一个实例
关于java - 当其他Panel中的ListBox发生变化时更新Panel内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22102590/