列出GWT中页面/面板的所有小部件

时间:2014-04-04 13:27:10

标签: java gwt uibinder

是否有一种编程方式来读取GWT页面或Panel包含的所有窗口小部件?

我的表单中有几个错误标签,所有错误标签都以“ErrorLabel”为后缀,我想找到并清除它们。我可以列出它们,但我发现如果我有一些......我可以实际自动化。

我正在使用UiBinder。

3 个答案:

答案 0 :(得分:2)

  

使用recursion方法获取任何组件的所有子项。

要遵循的步骤:(如何阅读UiField名称?)

  • 在gwt.xml中添加以下条目

    <inherits name="com.google.gwt.user.Debug"/> 
    
  • 使用debugIdui:field,如下所示ui.xml

    <gwt:CheckBox ui:field="myCheckBox" debugId="myCheckBox" />
    
  • 现在您可以获得ID

    myCheckBox.getElement().getId();
    
  • 使用默认前缀gwt-debug-生成所有ID,如下所示。如果您愿意,可以将其删除。

    gwt-debug-myCheckBox       
    

这是一个实用程序类:

注意:根据您的要求添加更多小部件和组件。

import java.util.Iterator;

import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.Widget;

public class WidgetValidator {

    private static void validateFlexTable(final FlexTable flextable) {
        for (int row = 0; row < flextable.getRowCount(); row++) {
            for (int column = 0; column < flextable.getCellCount(row); column++) {
                WidgetValidator.validateWidget(flextable.getWidget(row, column));
            }
        }
    }

    private static void validatePanel(final Panel panel) {
        final Iterator<Widget> iterator = panel.iterator();
        while (iterator.hasNext()) {
            WidgetValidator.validateWidget(iterator.next());
        }
    }

    public static void validateWidget(final Widget widget) {
        if (widget != null) {
            if (widget instanceof FlexTable) {
                WidgetValidator.validateFlexTable((FlexTable) widget);
            } else if (widget instanceof Panel) {
                WidgetValidator.validatePanel((Panel) widget);
            } else {
                System.out.println(widget.getElement().getId().replace("gwt-debug-", ""));
            }
        }
    }

}

答案 1 :(得分:1)

最简单的解决方案是为所有标签添加类名称 - 例如,&#34; errorLabel&#34;,并将以下行添加到CSS文件中:

.hide .errorLabel {display: none}

然后,如果你需要隐藏/显示所有这些标签,你可以用一行代码来完成:

parentPanel.addStyleName("hide");
parentPanel.removeStyleName("hide");

答案 2 :(得分:0)

类似的东西

private void myFunction(RootPanel panel) {
for (Widget w : panel) {
    if(w instanceof Label){
       //do something
    }
}
}