Formatter предназначен для преобразования некоторого значения в строку.
Formatter предназначен для использования с read-only компонентами, такими как Label, колонка Table и тому подобными. Для форматирования значения в редактируемых компонентах, например TextField, используйте механизм
Datatype
.
В XML-дескрипторе экрана formatter для компонента может быть задан во вложенном элементе formatter
. Элемент имеет единственный атрибут:
-
class
− имя класса, реализующего интерфейсcom.haulmont.cuba.gui.components.Formatter
Если конструктор класса formatter принимает параметр типа org.dom4j.Element
, то ему будет передан элемент XML, описывающий данный formatter
. Это можно использовать для параметризации экземпляра formatter'а, например, строкой форматирования. В частности, имеющиеся
в платформе классы DateFormatter
и NumberFormatter
могут брать строку форматирования из атрибута format
. Пример использования:
<column id="date"> <formatter class="com.haulmont.cuba.gui.components.formatters.DateFormatter" format="yyyy-MM-dd HH:mm:ss"/> </column>
Кроме того, класс DateFormatter
распознает также атрибут type
, который может принимать значения DATE
или DATETIME
. В этом случае форматирование производится с помощью механизма
Datatype
по строке формата dateFormat
или dateTimeFormat
соответственно. Например:
<column id="endDate"> <formatter class="com.haulmont.cuba.gui.components.formatters.DateFormatter" type="DATE"/> </column>
Если formatter реализован внутренним классом, то он должен быть объявлен с модификатором static
, а его имя для загрузки отделяется символом "$", например:
<formatter class="com.sample.sales.gui.OrderBrowse$CurrencyFormatter"/>
Formatter можно назначить компоненту не только в XML-дескрипторе экрана, но и программно, передавая экземпляр formatter'а
в метод setFormatter()
компонента.
Пример объявления собственного formatter'а и использования его для форматирования значения колонки таблицы:
public class CurrencyFormatter implements Formatter<BigDecimal> { protected GeneralConfiguration generalConfiguration; protected Currency currentCurrency; public CurrencyFormatter(GeneralConfiguration generalConfiguration) { this.generalConfiguration = generalConfiguration; currentCurrency = generalConfiguration.getCurrency(); } @Override public String format(BigDecimal value) { return currentCurrency.format(value); } }
protected void initTableColumns() { Formatter<BigDecimal> currencyFormatter = new CurrencyFormatter(generalConfiguration); table.getColumn("totalPrice").setFormatter(currencyFormatter); }