【问题标题】:How to format table values in vaadin?如何在vaadin中格式化表格值?
【发布时间】:2014-05-21 09:06:34
【问题描述】:

如果我有一个具有BigDecimal 属性的对象,我想以特定格式将其显示在Table 中:2 个分数,并根据数量使用“+”或“-”号。

例如:+10.50-3.20

如何在 vaadin 表中实现这一点?有一种方法table.setConverter(..),但这实际上会强制在BigDecimal.classString.class 之间进行转换。我所追求的只是一个视图格式化程序,它只是以不同的方式显示对象数据。

【问题讨论】:

    标签: java vaadin vaadin7


    【解决方案1】:

    虽然使用Table.formatPropertValue() 格式化表格列是一个可行的选择,但我强烈反对在使用 Vaadin 7 时使用此方法。formatPropertValue() 是旧的 Vaadin 6 格式化表格值的方法。为了向下兼容,此方法在 Vaadin 7 中仍然可用。使用这种方法在几个方面存在问题:

    • 它不是类型安全的。由于您只获得 Property<?> 作为参数,因此您首先必须检查属性值的具体类型。
    • 您必须仅从 Table 继承以适应一列或多列的格式。类继承绝对是针对特定用例调整类行为的错误方法。如果你有多个这样的情况,你最终会实现一堆 Table 子类,这些子类以后不能轻易互换。
    • 您将转换代码(BigDecimal 到 String)硬连接到某些 UI 组件的具体实现。这不利于重复使用。如果您需要在其他地方进行转换怎么办,比如当您在标签上显示 BigDecimal 时?您必须复制此代码或以某种方式将其提取到单独的类或方法中。

    最后一点正是 Vaadin 7 为您所做的:将转换逻辑与一些具体的 UI 组件分开。这就是com.vaadin.data.util.converter.Converter 接口的用途。因此,OP 在他/她的第一个假设中是非常正确的:Table.setConverter() 是使用 Vaadin 7 的方式。转换器是类型安全的并且允许关注点分离。

    可以用Table.setConverter() 设置的Converter 只能从BigDecimal 转换为String 的反对意见在这种情况下是不合理的。 Table.formatPropertValue() 没有做任何不同的事情 - 它也转换为字符串。但这很明显,Table 的列中除了 String 数据之外不显示任何内容。实际上,Table 的默认行为是对无法自行转换的Property 值类型调用toString() 方法。

    有关使用转换器,请参阅section 9.2.3 of the Book of Vaadin

    【讨论】:

    • 我认为OP想说的是使用Converter意味着您还需要实现另一个方向的转换以满足接口。
    • 也许吧。在任何情况下,只要不在字段组件上使用Converter,就可以只在一个方向上使用它。 Converter 的任何一种转换方法都可能引发 UnsupportedOperationException。有时甚至无法将演示数据转换为模型数据。
    【解决方案2】:

    Override受保护的方法Table.formatPropertValue()

    public class My_table
        extends Table
    {
        @Override
        protected String formatPropertyValue(final Object      a_row_id,
                                             final Object      a_col_id,
                                             final Property<?> a_property)
    
        {
            if (a_property.getType() == BigDecimal.class
                && null != a_property.getValue())
            {
                return "formatted-value";
            }
    
            return super.formatPropertyValue(a_row_id, a_col_id, a_property);
        }
    }
    

    参见Vaadin 之书部分5.16.6. Formatting Table Columns

    【讨论】:

    • 好的,到目前为止一切都很好。但是:如果我只想显示特定列的“+”和“-”符号,而所有其他 BigDecimal 列不应该显示这些符号怎么办?
    • @membersound,使用a_col_id 来确定值所属的列。
    【解决方案3】:

    您必须编写自己的表类扩展 Table 并覆盖 formatPropertyValue(Object rowId, Object colId, Property&lt;?&gt; property)

    请参阅book of Vaadin 中的第 5.15.6 节

    【讨论】:

      猜你喜欢
      • 2021-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多