Универсальный компонент в XML
Элемент XML component позволяет вам создать любой UI-компонент, указав его полное имя класса (FQN). Свойства компонента определяются с помощью вложенных элементов property, аналогично настройке действия.
Например, вы можете определить компонент Button таким образом:
<component id="button" class="io.jmix.flowui.kit.component.button.JmixButton">
<properties>
<property name="text" value="Save"/>
<property name="icon" value="ARCHIVE" type="ICON"/>
</properties>
</component>
Вот пример определения пользовательского компонента:
Фреймворк создает экземпляр класса компонента и применяет заданные свойства через соответствующие методы-сеттеры. В этом примере
свойство text соответствует setText(), а парсер свойства ICON преобразует ARCHIVE в экземпляр иконки для setIcon().
Подписаться на универсальный компонент в контроллере экрана можно так же, как и на обычный декларативный компонент:
@Autowired
protected Notifications notifications;
@Subscribe(id = "button", subject = "clickListener")
public void onButtonClick(ClickEvent<JmixButton> event) {
notifications.show("Saved!");
}
Этот же механизм можно использовать и для пользовательского компонента, если его сеттеры принимают преобразованные значения:
<component id="testComponent" class="com.company.onboarding.component.TestComponent">
<properties>
<property name="stringsList" value="a b ,c"/>
<property name="stringsSet" value="a b ,c"/>
<property name="stringsArray" value="a b ,c"/>
<property name="strings" value="a b ,c"/>
<property name="dataContainer" value="productsDc" type="CONTAINER_REF"/>
</properties>
</component>
В этом примере класс TestComponent определяет сеттеры для stringsList, stringsSet, stringsArray,
strings и dataContainer. Jmix преобразует строковые значения из XML и разрешает productsDc
контейнер данных перед вызовом соответствующих сеттеров.
Конфигурация свойств
-
Значение атрибута
nameпреобразуется в имя метода-сеттера, например:-
text→setText() -
dataLoader→setDataLoader()
-
-
Фреймворк ищет метод с соответствующим
nameи одним входным параметром для установки значения.Если несколько методов имеют одинаковое имя, нет гарантии, что для установки значения будет использован именно предполагаемый метод. -
Тип входного параметра найденного метода используется для преобразования строкового значения из атрибута
valueв фактическое значение.Встроенное преобразование поддерживает
String,Class, логические и числовые типы, перечисления,List,Setи массивы. Сеттеры с varargs тоже работают, поскольку они обрабатываются как параметры-массивы. Элементы коллекций и массивов разделяются пробелами или запятыми перед преобразованием. -
Атрибут
typeуказывает, что строковое значение должно быть преобразовано одним из подключаемых биновPropertyParser:Тип Парсер Описание ICONIconPropertyParserПреобразует строку в экземпляр
IconCONTAINER_REFDataContainerPropertyParserНаходит контейнер данных по
IDLOADER_REFDataLoaderPropertyParserНаходит загрузчик данных по
ID
Парсеры свойств
Когда строковые значения не могут быть напрямую преобразованы с использованием типа параметра, преобразованием занимаются подключаемые бины PropertyParser.
В настоящее время существует три реализации:
-
IconPropertyParser. Преобразует строки в экземпляры
Icon.-
Если переданная строка содержит разделитель
:, новыйIconсоздается с использованием значений коллекции иконок и имени иконки. -
В противном случае строка трактуется как имя константы
VaadinIcon.Примеры:
-
"PLUS"→ иконкаVaadinIcon.PLUS. -
"myicons:custom"→ Иконка из пользовательской коллекции"myicons"с именем"custom".
-
-
DataContainerPropertyParser. Возвращает контейнер данных с заданным
IDиз объектаViewDataсоответствующего экрана. -
DataLoaderPropertyParser. Возвращает загрузчик данных с заданным
IDиз объектаViewDataсоответствующего экрана.