Должны ли мы использовать FXML в пользовательских элементах управления JavaFX или нет?

Кажется, что это связано с вопросом, я думаю, что использование FXML для написания наших пользовательских компонентов - это, очевидно, правильный путь.

Но, как мы видим из ControlsFX, JFXextras и даже из книги «Освоение элементов управления JavaFX8», не используется и не упоминается использование FXML в пользовательских элементах управления.

Несмотря на это, в официальной документации говорится, что нужно идти по этому пути и создавать элементы управления JavaFX через FXML.

Как правильнее и почему?


person David Limkys    schedule 17.11.2014    source источник


Ответы (2)


В JavaFX есть два вида настраиваемых элементов управления:

  • пользовательские элементы управления на базе fx:root. скины.

    Если вы разработчик приложений, это то, что вы хотите использовать большую часть времени.

    Этот тип элементов управления обычно зависит от приложения или организации. Дополнительные пользовательские скины для этих элементов управления не нужны, достаточно CSS.

    Обычно они просто группируют некоторые элементы управления вместе, предоставляют более удобный API и скрывают внутренности.

    Их намного проще написать, чем настраиваемые элементы управления с изменяемой обложкой.

    Я думаю об этом как об альтернативе подклассам JPanel в мире Swing.

    Я предлагаю разбить ваш графический интерфейс на небольшие автономные элементы управления на основе fx: root (высокая связность, низкая связанность). Используйте шаблон посредника для объединения этих элементов управления (родительский элемент управления управляет/настраивает свои дочерние элементы управления и прослушивает события своих дочерних элементов управления. Дочерние элементы управления не знают друг о друге).

    Вы можете создавать целые иерархии таких элементов управления. Разбивка их на небольшие элементы управления упростит обслуживание (например, если макет или взаимодействие с пользователем должны измениться).

  • Настраиваемые элементы управления с изменяемым оформлением: настраиваемые элементы управления с изменяемым оформлением не только настраиваются (с помощью CSS), но и их внешний вид можно полностью изменить, предоставив пользовательское оформление.

    Если вы являетесь разработчиком библиотеки элементов управления, то, скорее всего, вы захотите предоставить настраиваемые элементы управления с изменяемой обложкой, чтобы пользователи библиотеки могли максимально эффективно использовать JavaFX.

    Этот тип элементов управления, как правило, является очень простым, многократно используемым элементом управления и часто (но не всегда) также использует некоторое пользовательское рисование.

    Их сложнее получить правильно, чем пользовательские элементы управления на основе fx: root.

person Puce    schedule 18.11.2014
comment
Отличный ответ. Обратите внимание, что с элементами управления на основе fx:root ваш элемент управления должен будет предоставлять изменяемый список дочерних узлов (например, быть подклассом Pane), что является одним аспектом, который делает его несколько непригодным для разработки библиотеки. Пользовательский элемент управления с изменяемым оформлением может быть подклассом Control, поэтому элементы, составляющие элемент управления, не могут быть добавлены или удалены конечным пользователем, и, как вы указываете, он занимает естественное место в иерархии API. - person James_D; 18.11.2014
comment
Oracle решила использовать (в основном) подход fx:root при создании SceneBuilder, поэтому вы могли изучите исходный код SceneBuilder, чтобы найти конкретные примеры, используемые в коде приложений для производства. - person jewelsea; 18.11.2014

Не существует правильного пути. Но мы можем разбить его на это:

Известно ли вам количество элементов JavaFX, которые необходимо отобразить перед запуском приложения? Если да, вы можете создать свой графический интерфейс с помощью SceneBuilder или непосредственно в XML, написав файл FXML. Это верно для большинства настроек экрана с графическим интерфейсом, где общий макет (меню, панель инструментов, содержимое, боковая панель и т. д.) хорошо известен и не меняется со временем.

Теперь пользовательские компоненты не умеют отображать себя. Существует множество параметров, которым можно соответствовать, и большинство пользовательских компонентов создаются динамически или могут радикально меняться по мере того, как пользователь меняет эти параметры. Вы не можете написать один файл FXML, вместо этого вам придется написать много отдельных файлов, каждый из которых будет создавать небольшую часть пользовательского компонента. Это не очень удобно, поэтому большинство разработчиков предпочитают делать это без FXML, прямо в коде.

И вдобавок ко всему: существует множество пользовательских компонентов, которые используют специальный макет, не встроенный в JavaFX, для достижения которого вам нужно написать свои собственные контейнеры и связать их с пользовательскими компонентами, чтобы получить идеальный результат. В конце создаются (или лучше: должны быть созданы) пользовательские компоненты для использования внутри FXML/SceneBuilder.

person eckig    schedule 18.11.2014