我是GWT的新手。
我有两个ListBox
元素(让我们称之为A
和B
)在两个不同的面板中(如果重要的话,正好是Composite
和VerticalPanel
;让我们看看称他们为panelA
和panelB
},他们有一个共同的父母(parentPanel
)
我希望在A
更改时B
更新项目列表。
我如何在GWT中这样做?
我的第一个想法是将changeHandler
添加到B
,我在updateItems()
上调用了一些公开A
方法。
Hovewer,panelA
根本无法访问panelB
。更糟糕的是A
是私人内部类panelA
。
我可以将所有这些类/方法等公开以使其工作,但我觉得这不是正确的方法。
我的设计不好吗?在GWT中做这些事情的正确方法是什么?我想我只是错过了一个关键词来开始研究......
任何帮助将不胜感激。不要求代码,只是一般概念或建议。
答案 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.