GWT:从FormPanel / VerticalPanel检索动态添加的组件

时间:2013-01-12 04:27:35

标签: gwt components custom-component smartgit

我正在使用GWT 2.5.0创建一个网页,在此我使用了大量的复合组件。网页是基于XML开发的。

所以在这里我们解析XML并根据每个元素将组件添加到VerticalPanel,最后将其添加到FormPanel,然后将其返回以添加到RootPanel。除了组件对应XML之外,我添加一个Button,将其命名为提交按钮,在其click事件上我想获取该表单中每个组件的值。 为了清楚我的想法,下面是我工作的伪代码:

public FormPanel createFormWithComponents(){

    FormPanel fp = new FormPanel();
    vp = new VerticalPanel();
    //these are creatred based on the xml
    ABC coutn = new ABC (null,"pressure count",true);
    PI propotion =  new PI(12.5,"HR percentage");

    vp.add(coutn);
    vp.add(propotion);
    //a common button to every form created here
    Button submit = new Button("submit");
    vp.add(submit);
    submit.addClickHandler(new ClickHandler() {

        @Override
        public void onClick(ClickEvent event) {

更新

                String values = "";
                Iterator<Widget> vPanelWidgets =  vp.iterator();
                while (vPanelWidgets.hasNext()){
                    Widget childWidget = vPanelWidgets.next();
                    if(childWidget instanceof ABC){
                        ABC xx = (ABC )childWidget;
                        values = String.valueOf(xx.getMagnitude());
                    }
                }
                Window.alert(values);
            }
        });

        fp.add(vp);
        return fp;
    }

任何见解都将受到赞赏。 更新: 这里我将每个子窗口小部件组件与我的一个Composite组件进行比较,与所有Composite组件相比,我是否必须这样做?我有什么简单或优化的方法吗? 我想要这个过程有很好的解决方案,因为那里有很多复合组件:

if(childWidget instanceof ABC ){
    ABC xx = (ABC )childWidget;
    values = String.valueOf(xx.getMagnitude());
}

2 个答案:

答案 0 :(得分:2)

您可以使所有Composite组件实现具有单个getValue()方法的接口:

public interface HasValue {
    public String getValue();
}

然后,您可以轻松提取实现该接口的所有小部件的值:

    while (vPanelWidgets.hasNext()){
        Widget childWidget = vPanelWidgets.next();
        if(childWidget instanceof HasValue){
            HasValue xx = (HasValue) childWidget;
            values = xx.getValue();
        }
    }

如果需要返回字符串以外的值,可以使用泛型。看一下GWT com.google.gwt.user.client.ui.HasValue的一个例子(您也可以使用该界面而不是创建自己的界面)。

答案 1 :(得分:0)

您只能在GWT FormPanel小部件中添加一个小部件,然后您可以使用getWidget()方法获取它:

FormPanel panel = createFormWithComponents();

RootPanel.get().add(panel);

VerticalPanel vp = (VerticalPanel) panel.getWidget();
int widgetCount = vp.getWidgetCount();
Window.alert(widgetCount+" ...");