Всегда приятно общаться с приложением, которое запоминает ваши привычки и словно чувствует, чего вы хотите.
Любая UI-библиотека или платформа, к сожалению, имеет только базовый функционал и набор компонентов.
Например, если столбец в таблице не перемещается или не может быть по нему отсортирован, то приложение, в котором он используется, вряд ли можно назвать дружественным.
К счастью, сегодня таким функционалом никого не удивишь.
Однако не каждая программа запомнит положение этого столбца и отобразит его в следующем сеансе точно на том же месте.
Также может раздражать каждый раз устанавливать положение разделителя.
Сплитпане или введите те же параметры фильтра.
Как правило, такие удобства приходится обеспечивать самим разработчикам.
Примеров таких, казалось бы, небольших улучшений много, но решений, предлагаемых платформой, всего два, и по сути они схожи: создать свой компонент на основе базового, создать свой Кожа к базовому компоненту, переопределяя поведение.
Ни тот, ни другой метод нелегко реализовать; более того, для каждого компонента потребуется написать свой собственный компонент-адаптер.
Я встречал немало людей, которым этот метод был более знаком и понятен.
Но он далеко не единственный.
Что, если мы возьмем возможности платформы, поддерживающей шаблон браузера для детей? Узел , а при добавлении или удалении подграфа Узел запускать набор плагинов, каждый из которых выполняет свою конкретную работу? Один может все запомнить и восстановить во время второго сеанса, другой — изменить контекстное меню для указанных компонентов, добавив функцию копирования текста.
Некоторые из них добавляют три точки в конце текста, если он не помещается, а при наведении мыши показывают всплывающую подсказку с полным текстом, только если он не помещается.
Самое главное, что не важно, из какой библиотеки этот компонент, можем ли мы от него наследовать и переопределить нужное нам поведение.
В этом случае все, что нам нужно, это научить плагин работать с нужными компонентами разными способами, если это необходимо.
Прослушиватель дочерней коллекции может выглядеть так:
Это будет код для обработки каждого измененного Узел -с:private final ListChangeListener changeListener = (ListChangeListener<Node>) (ListChangeListener.Change<? extends Node> c) -> { if (c.next()) { c.getAddedSubList().
forEach(this::applySettingsForNodeAndAddListenerForItsChild); } };
private void applySettingsForNodeAndAddListenerForItsChild(Node n) {
if (!checkApplySettings(n)) {
apply(n);
ObservableList<Node> children = getChildren(n);
if (children != null) {
addListnerForUpdateChildren(children);
}
markNodePropertyApplied(n);
}
}
А это прямой код вызова самого плагина, который зарегистрирован для этого типа компонента:
public Node apply(Node node) {
List<SettingsPlugin> settingsPlugins = settingsMap.get(Node.class);
if (settingsPlugins != null) {
for (SettingsPlugin plugin : settingsPlugins) {
node = plugin.apply(node, userSettings.getSettings());
}
}
List<SettingsPlugin> settingList = settingsMap.get(node.getClass());
if (settingList != null) {
for (SettingsPlugin plugin : settingList) {
node = plugin.apply(node, userSettings.getSettings());
}
}
return node;
}
Вот интерфейс самого плагина:
public interface SettingsPlugin {
public Node apply(Node node, Map<String, Object> userSettings);
}
Необходимо только для коллекций дочерних элементов.
Корень элемент Сцена зарегистрируйте прослушиватель один раз, а в остальной части подграфа он зарегистрируется сам.
В последнее время я провожу аналогию с возможностями платформ для десктопных и веб-приложений.
Было бы интересно узнать, как схожий функционал можно реализовать на разных фреймворках.
Теги: #программирование #java #Node #плагин #JavaFX #адаптер
-
Какая-То Подозрительная Надпись
19 Oct, 24 -
Cms На Базе Codeigniter – Текущая Ситуация
19 Oct, 24 -
Автономный Русский Tumblr
19 Oct, 24 -
Резюме Программистов. Часть 1 (Плохая)
19 Oct, 24