其他面板中的ListBox更改时更新Panel内容

时间:2014-02-28 18:04:15

标签: java gwt event-handling panel

我是GWT的新手。

我有两个ListBox元素(让我们称之为AB)在两个不同的面板中(如果重要的话,正好是CompositeVerticalPanel;让我们看看称他们为panelApanelB},他们有一个共同的父母(parentPanel我希望在A更改时B更新项目列表。

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

我可以将所有这些类/方法等公开以使其工作,但我觉得这不是正确的方法。
我的设计不好吗?在GWT中做这些事情的正确方法是什么?我想我只是错过了一个关键词来开始研究......

任何帮助将不胜感激。不要求代码,只是一般概念或建议。

3 个答案:

答案 0 :(得分:1)

使用您的活动/演示者来推动这些更改。例如,在您的活动/演示者中:

myView.getListBoxB().addChangeHandler(new ChangeHandler() {

    @Override
    public void onChange(ChangeEvent event) {
        updateListBoxA();
    }
});

private void updateListBoxA() {
    ListBox listBoxA = myView.getListBoxA();
    // do what is necessary
}

您也可以在ParentPanel小部件中执行此操作。这一切都取决于您遵循的设计模式。

答案 1 :(得分:1)

使用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的{​​{1}}事件中,您点击了ListBoxB

ListBoxBEvent

确保通过使用Singleton或DI

在应用程序中使用EventBus对象的一个​​实例

答案 2 :(得分:1)

正如Moh所说,你必须使用MVP archetecture看:official documentation,演示者必须能够访问你的A&amp; B抛出panelA和panelB,然后绑定你的A. 例如:

public class MyPresenter {
public interface Display {
 CheckBox getA();/* get button A to bind it to appropriate action */
 CheckBox getB(); /* get B to update it */
//.......other thing you want get from you View 
} // end of interface

private Display display;
/*
* you presenter logic ..
*/
//constructor and initialisation ...
public MyPresenter (Display display/*, MyService myService ..,.. refer to doc*/){
   this.diplay=display;
}

private void bind(){
   display.getA().addValueChangeHandler(new ValueChangeHandler<String>() {
@Override
public void onValueChange(ValueChangeEvent<String> event) {

     //access B by : then update it:: display.getB();
}
});
}//end bind().
// other staff ...

然后你必须实现MyPresenter.Display界面。

public class MyView extends /*SomeClass*/ implements MyPresenter.Display{
/* view logic,  you must to refactor you code logic to be "more conform" to best practice
   see also the example in the doc  */
then you have to implement missing methods ( getA and getB ) ( or your widget) that make available you buttons to the presenter.