Написание пользовательских элементов управления в JavaFX — это простой и понятный процесс. Класс управления необходим для управления состоянием элемента управления (отсюда и название). Класс кожи необходим для появления элемента управления. И чаще всего CSS-файл для настройки внешнего вида.
Общий подход к элементам управления заключается в том, чтобы скрыть узлы, которые они используют, внутри своего класса скина. Например, элемент управления TextField использует два экземпляра javafx.scene.text.Text . Один для обычного текста, один для текста подсказки. Эти узлы не доступны через API TextField . Если вы хотите получить ссылку на них, вам нужно вызвать метод lookup (String) на Node . Все идет нормально. На самом деле трудно представить себе случаи использования, когда вам действительно необходим доступ к узлам Text .
Но…
Это становится совсем другой историей, если вы разрабатываете сложные пользовательские элементы управления. FlexGanttFX Диаграмма Ганта является одним из примеров. Элемент управления GanttChart состоит из множества других сложных элементов управления, и в соответствии с принципом « разделения интересов » эти элементы управления содержат все те методы и свойства, которые необходимы для их правильной работы. Если бы эти элементы управления были скрыты внутри оболочки диаграммы Ганта, тогда не было бы никакого доступа к ним, и элемент управления диаграммы Ганта должен был бы реализовать целый набор методов делегирования. Это полностью загромождает API диаграммы Ганта. По этой причине класс GanttChart предоставляет методы доступа для своих дочерних элементов управления и даже фабричные методы для создания дочерних узлов.
пример
На следующем снимке экрана показан новый элемент управления, над которым я сейчас работаю для проекта ControlsFX . Я называю это ListSelectionView, и он имеет два экземпляра ListView . Пользователь может перемещать элементы из одного списка в другой, дважды щелкнув по ним или используя кнопки посередине.
Представления списка представляют собой сложные элементы управления. У них есть свои собственные модели данных и выбора, свои собственные фабрики ячеек, они запускают события и так далее, и так далее. Все эти вещи мы могли бы хотеть или настроить или слушать. Что-то сложно сделать, если представления скрыты в классе скина. Решение состоит в том, чтобы создать представления списка внутри класса управления через защищенные фабричные методы и предоставить методы доступа.
Следующий фрагмент кода показывает шаблон, который можно использовать:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
public class ListSelectionView<T> extends Control { private ListView<T> sourceListView; private ListView<T> targetListView; public ListSelectionView() { sourceListView = createSourceListView(); targetListView = createTargetListView(); } protected ListView<T> createSourceListView() { return new ListView<>(); } protected ListView<T> createTargetListView() { return new ListView<>(); } public final ListView<T> getSourceListView() { return sourceListView; } public final ListView<T> getTargetListView() { return targetListView; } } |
Методы фабрики могут использоваться для создания стандартных экземпляров ListView и их настройки прямо здесь или для возврата уже существующих специализаций ListView . Компания под названием ACME может уже предоставить стандартный набор элементов управления (которые реализуют маркетинговую концепцию компании). Тогда фабричные методы могут вернуть элемент управления, называемый ACMEListView .
Ссылка: | Совет по JavaFX 10: пользовательские составные элементы управления от нашего партнера JCG Дирка Леммермана в блоге Pixel Perfect . |