如果我有一个BigDecimal
属性的对象,我希望在具有特定格式的Table
中显示它:2个分数,以及" +"或" - "根据金额签字。
例如:+10.50
,-3.20
如何在vaadin表中实现这一目标?有一种方法table.setConverter(..)
,但这实际上会强制在BigDecimal.class
和String.class
之间进行转换。我之后只是一个只是以不同方式显示对象数据的视图格式化程序。
答案 0 :(得分:9)
虽然使用Table.formatPropertValue()
格式化表列是一个可行的选项,但我强烈反对在使用Vaadin 7时不使用此方法。formatPropertValue()
是旧的Vaadin 6格式化表值的方法。 Vaadin 7中仍然可以使用此方法向下兼容。使用这种方法在几个方面存在问题:
Property<?>
作为参数,因此首先必须检查属性值的具体类型。最后一点正是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)
。