3.5.2.4.2. 格式化控件

API 文档



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

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

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

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

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

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

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

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



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



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

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

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

  1. public class CurrencyFormatter implements Formatter<BigDecimal> {
  2. protected GeneralConfiguration generalConfiguration;
  3. protected Currency currentCurrency;
  4. public CurrencyFormatter(GeneralConfiguration generalConfiguration) {
  5. this.generalConfiguration = generalConfiguration;
  6. currentCurrency = generalConfiguration.getCurrency();
  7. }
  8. @Override
  9. public String format(BigDecimal value) {
  10. return currentCurrency.format(value);
  11. }
  12. }
  1. protected void initTableColumns() {
  2. Formatter<BigDecimal> currencyFormatter = new CurrencyFormatter(generalConfiguration);
  3. table.getColumn("totalPrice").setFormatter(currencyFormatter);
  4. }