3.5.2.4.2. 格式化控件

格式化控件只能跟只读组件一起用,比如LabelTable Column等等。对于可编辑的组件值,比如TextField 应该用 Datatype 机制来格式化。

在界面的 XML 描述中,组件的格式化控件可以在嵌套的 formatter 元素中定义。这个元素有一个单一的属性:

  • class − 实现了 com.haulmont.cuba.gui.components.Formatter 接口的一个类。

如果格式化控件的构造函数中有 org.dom4j.Element 的参数,那么这个格式化控件可以接受额外的属性来描述此格式化控件。比如,可以用格式化的字符串作为这个额外的参数。CUBA 框架里的 DateFormatterNumberFormatter 这两个类就可以从 format 属性读取格式化模板:

<column id="date">
    <formatter class="com.haulmont.cuba.gui.components.formatters.DateFormatter" format="yyyy-MM-dd HH:mm:ss"/>
</column>

另外,DateFormatter 类也能识别 type 属性,这个属性可以有 DATEDATETIME 两个值。如果用了这个属性,其实就是使用 Datatype 机制的 dateFormat 或者 dateTimeFormat 来做格式化,比如:

<column id="endDate">
    <formatter class="com.haulmont.cuba.gui.components.formatters.DateFormatter" type="DATE"/>
</column>

默认情况下,DateFormatter 用服务器的时区来显示日期和时间。如果需要使用用户的时区来显示,设置格式化控件的 useUserTimezone 属性为 true

如果格式化控件对应的类是一个内部类,那么这个类需要声明成 static 的,在 XML 描述中,需要用 "$" 符号来分隔包和内部类。比如:

<formatter class="com.sample.sales.gui.OrderBrowse$CurrencyFormatter"/>

格式化控件除了可以通过 XML 描述来分配给组件之外,也可以通过编程的方式实现 - 在组件的 setFormatter() 方法里设置一个格式化类的实例。

下面这个例子是声明一个自定义的格式化控件类,然后在表格的某一列里面使用:

public class CurrencyFormatter implements Function<BigDecimal, String> {

    @Override
    public String apply(BigDecimal bigDecimal) {
        return NumberFormat.getCurrencyInstance(Locale.getDefault()).format(bigDecimal);
    }
}
@Inject
private GroupTable<Order> ordersTable;

@Subscribe
public void onInit(InitEvent event) {
    Function currencyFormatter = new CurrencyFormatter();
    ordersTable.getColumn("totalPrice").setFormatter(currencyFormatter);
}