如何格式化vaadin中的表值?

时间:2014-05-21 09:06:35

标签: java vaadin vaadin7

如果我有一个BigDecimal属性的对象,我希望在具有特定格式的Table中显示它:2个分数,以及" +"或" - "根据金额签字。

例如:+10.50-3.20

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

3 个答案:

答案 0 :(得分:9)

虽然使用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()的转换器仅从BigDecimal转换为String的反对意见是不合理的。 Table.formatPropertValue()没有做任何不同的事情 - 它也会转换为String。但很明显,Table不会在其列中显示除String数据之外的任何内容。实际上,Table的默认行为是在toString()值类型上调用它无法自行转换的Property方法。

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

答案 1 :(得分:6)

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

请参阅 Book of Vaadin 部分5.16.6. Formatting Table Columns

答案 2 :(得分:0)

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

请参阅book of Vaadin

中的第5.15.6节