如何在GWT的ui.xml文件中为FlexTable添加静态值
GWT FlexTable在ui.xml中配置第一列行名称的正确方案
问题原因分析
你尝试的两种写法均无法生效,核心原因在于:
- 直接使用
<tr>/<td>:FlexTable是GWT封装的动态表格组件,UIBinder不支持直接嵌套原生HTML表格标签,编译时会因无法解析结构报错。 - 使用
<gwt:row>/<gwt:cell>:GWT并未为FlexTable定义这两个自定义标签,因此会提示标签不存在。
解决方案1:替换为HTMLTable(推荐,直接在ui.xml配置结构)
如果业务场景允许替换表格组件,HTMLTable支持在UI.xml中直接声明表格结构,完美匹配你的需求:
修改后的ui.xml代码
<gwt:HTMLPanel> <table ui:field="financialTable" border="1"> <!-- 第一列行名称直接在ui.xml配置 --> <tr> <td>Month</td> <!-- 后续月份列留空,通过Java代码动态填充 --> </tr> <tr> <td>income</td> </tr> <tr> <td>expence</td> </tr> </table> </gwt:HTMLPanel>
对应的Java代码
public class FinancialWidget extends Composite { private static FinancialWidgetUiBinder uiBinder = GWT.create(FinancialWidgetUiBinder.class); interface FinancialWidgetUiBinder extends UiBinder<Widget, FinancialWidget> {} @UiField HTMLTable financialTable; public FinancialWidget() { initWidget(uiBinder.createAndBindUi(this)); initTableData(); } // 从服务获取并填充剩余12列数据 private void initTableData() { // 填充第一行的月份名称(示例) for (int col = 1; col < 13; col++) { financialTable.setText(0, col, "第" + col + "月"); // 填充收入数据(模拟服务返回) financialTable.setText(1, col, getIncomeData(col)); // 填充支出数据(模拟服务返回) financialTable.setText(2, col, getExpenceData(col)); } } private String getIncomeData(int month) { return "¥" + (month * 1200); } private String getExpenceData(int month) { return "¥" + (month * 900); } }
解决方案2:保留FlexTable,通过UIBinder常量配置行名称
如果必须保留FlexTable,可以将行名称配置在UI.xml的常量中,通过Java代码读取并设置:
修改后的ui.xml代码
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder' xmlns:gwt='urn:import:com.google.gwt.user.client.ui'> <!-- 定义行名称常量 --> <ui:with field="rowLabels" type="java.util.HashMap"> <ui:property name="month" value="Month"/> <ui:property name="income" value="income"/> <ui:property name="expence" value="expence"/> </ui:with> <gwt:HTMLPanel> <gwt:FlexTable ui:field="financialFlexTable"/> </gwt:HTMLPanel> </ui:UiBinder>
对应的Java代码
public class FinancialWidget extends Composite { private static FinancialWidgetUiBinder uiBinder = GWT.create(FinancialWidgetUiBinder.class); interface FinancialWidgetUiBinder extends UiBinder<Widget, FinancialWidget> {} @UiField FlexTable financialFlexTable; @UiField HashMap<String, String> rowLabels; public FinancialWidget() { initWidget(uiBinder.createAndBindUi(this)); setRowNamesFromConfig(); initTableData(); } // 从UI配置中读取第一列行名称 private void setRowNamesFromConfig() { financialFlexTable.setText(0, 0, rowLabels.get("month")); financialFlexTable.setText(1, 0, rowLabels.get("income")); financialFlexTable.setText(2, 0, rowLabels.get("expence")); } // 填充剩余列数据 private void initTableData() { for (int col = 1; col < 13; col++) { financialFlexTable.setText(0, col, "第" + col + "月"); financialFlexTable.setText(1, col, getIncomeData(col)); financialFlexTable.setText(2, col, getExpenceData(col)); } } private String getIncomeData(int month) { return "¥" + (month * 1200); } private String getExpenceData(int month) { return "¥" + (month * 900); } }
内容的提问来源于stack exchange,提问作者Pavel Bulygin
相关产品推荐
相关产品推荐

