我是GWT的新手。

我在两个不同的面板(精确地称为ListBoxA,如果有的话,有两个B元素(我们分别称为CompositeVerticalPanel);我们将它们称为panelApanelB)具有共同父母(parentPanel)。
我想在A更改时更新B中的项目列表。

如何在GWT中做到这一点?
我的第一个想法是将changeHandler添加到B,在其中我在updateItems()上调用一些公共A方法。
但是,根本无法从panelA访问panelB。更糟糕的是,ApanelA的私有内部类。

我可能可以公开所有这些类/方法等,以使它起作用,但是我觉得这不是正确的方法。
我的设计不好吗?在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);
            }
        });


OnChangeListBoxB事件中,您触发ListBoxBEvent

view.getListBoxB().addChangeHandler(new ChangeHandler() {
    @Override
    public void onChange(ChangeEvent event) {
       eventBus.fireEvent(new ListBoxBEvent(selectedObject));
    }
});


确保使用Singleton或DI通过应用程序使用EventBus对象的一个​​实例

08-03 13:30