【问题标题】:GWT: retrieve Components from FormPanel/VerticalPanel which are added dynamicallyGWT:从动态添加的 FormPanel/VerticalPanel 中检索组件
【发布时间】:2012-12-26 17:57:12
【问题描述】:

我正在使用 GWT 2.5.0 创建一个网页,其中我使用了很多复合组件。并且网页是基于XML开发的。

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

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;
    }

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

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

【问题讨论】:

    标签: gwt components custom-component smartgit


    【解决方案1】:

    您可以让所有复合组件实现一个具有单个 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 就是一个例子(你也可以使用那个接口而不是创建你自己的接口)。

    【讨论】:

      【解决方案2】:

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

      FormPanel panel = createFormWithComponents();
      
      RootPanel.get().add(panel);
      
      VerticalPanel vp = (VerticalPanel) panel.getWidget();
      int widgetCount = vp.getWidgetCount();
      Window.alert(widgetCount+" ...");
      

      【讨论】:

      • 我想你没有明白我的问题到底是什么,我也这样做了,创建了一个垂直面板,将其添加到 FormPanel,并将其添加到 RootPanle。我的问题是,组件是复合组件。单击提交按钮时,我想检索该组件中的值。我需要的是与这些组件相关的值。谢谢。
      • 您可以为您的复合组件添加一些 getter 方法,并从您的复合组件返回所需的值,然后在点击事件处理程序中获取这些值(使用 getter 方法)。
      • 这怎么可能这么简单,我的流程的主要方面是:#1。每个组件都是动态添加的#2。基于 XML,我将复合组件添加到面板,然后形成该面板。 #3。垂直面板可能包含另一个垂直面板和元素,这取决于 xml。那我怎么知道表单中有哪个组件呢?哪种类型?我怎样才能从表单中检索我的组件?请您提供检索组件的伪代码吗?
      • 另一种方法是为小部件设置 id 属性 "fp.getElement().setAttribute("id", "fp");"然后通过他们的 ids "Element elem = DOM.getElementById("fb");" 找到你的小部件
      • 另一种替代方法是:如果您确定您的按钮添加到面板,然后添加到 FormPanel,或者您可以从 xml 文件中找出小部件的级别,然后使用 getParent 方法:“FormPanel fp = (FormPanel) (((Button) event.getSource()).getParent().getParent());"
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-26
      • 1970-01-01
      • 2011-07-31
      相关资源
      最近更新 更多