如何格式化vaadin中的表值?

mem*_*und 5 java vaadin vaadin7

如果我有一个具有BigDecimal属性的对象,我想Table用特定格式显示它:2个分数,并根据数量使用"+"或" - "符号.

如:+10.50,-3.20

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

Rol*_*ger 9

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

  • 它不是类型安全的.由于您只获得一个Property<?>参数,因此首先必须检查属性值的具体类型.
  • 您必须仅从Table继承以适应一个或多个列的格式.对于一个特定用例来说,类继承绝对是一种错误的方法来调整类的行为.如果你有多个这样的情况,你最终会实现一堆Table子类,以后不能轻易互换.
  • 您将转换代码(BigDecimal to 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.

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


hmj*_*mjd 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

参见Book of Vaadin5.16.6.格式化表列.