Каковы плюсы и минусы FXML?

Каковы плюсы и минусы использования FXML или отказа от использования FXML для разработки приложений JavaFX?

Какой подход следует использовать для разработки корпоративного приложения JavaFX?


person Angom    schedule 07.01.2014    source источник
comment
См. соответствующий вопрос Java FX: декларативный и процедурный, в котором также обсуждается эта тема.   -  person jewelsea    schedule 11.08.2016


Ответы (2)


Минусы FXML: для загрузки и отображения требуется немного больше времени.

Плюсы FXML:

  • Быстрая разработка сцены / макет с использованием Scene Builder.
  • FXML не является компилируемым языком; вам не нужно перекомпилировать код, чтобы увидеть изменения. Просто перезагрузите файл FXML.
  • Он обеспечивает четкое отделение графического интерфейса от логики/контроллера.
  • Таким образом, вы можете иметь разные версии сцены/представления, используя один и тот же контроллер. Это удобно, например, для демо.
  • Содержимое файла FXML можно локализовать по мере чтения файла.

Обязательно используйте FXML в корпоративных приложениях!

person Jurgen    schedule 07.01.2014
comment
Итак, есть ли рекомендация всегда использовать FXML? - person Angom; 07.01.2014
comment
@Ang Обычно используйте FXML. Для очень простого представления, такого как всплывающее окно, содержащее текстовое поле и кнопку, вам, возможно, не нужно использовать FXML. - person Jurgen; 07.01.2014
comment
Проектирование сцены и размещение элементов управления с использованием кода может стать запутанным по мере роста сложности. Scenebuilder предоставляет очень интерактивный способ размещения элементов управления на сцене и немедленного предварительного просмотра. - person Sudip Saha; 07.01.2014
comment
@Angom Номер 3 Jurgen Pros действительно важен. SceneBuilder может быть сильным профессионалом, но лично я не чувствую необходимости его использовать: многие люди используют декларативный язык для графического интерфейса без инструмента WYSIWIYG. Имейте в виду, что разделение интересов всегда важно в программном обеспечении. - person zenbeni; 14.01.2014
comment
Я не согласен с рекомендацией обязательно использовать FXML в корпоративных приложениях. Я начал писать свое приложение с помощью FXML, но вскоре отказался от него, потому что он слишком ограничивал меня. Мое главное возражение заключается в том, что вы не можете использовать универсальные контроллеры. Вы можете жить без них, но это делает вещи намного сложнее, а код менее элегантным. Кроме того, для больших форм требуется более чем немного больше времени для загрузки. Файл FXML необходимо проанализировать и создать граф объектов с использованием отражения. И что интересно, теперь, когда я написал несколько вспомогательных методов, я могу быстрее создавать формы из кода, чем с помощью Scene Builder. - person Nikša Baldun; 16.01.2014
comment
@Nik Спасибо за комментарий. Я заинтригован вашим использованием универсальных контроллеров, можете ли вы предоставить ссылку, чтобы показать пример? (Не уверен, что это актуально, но FXMLLoader можно назначить отдельному контроллеру или даже фабрике контроллеров.) - person Jurgen; 16.01.2014
comment
@Юрген Например. если у вас есть форма, которая отображает список сущностей, вам не нужно создавать отдельный контроллер для каждого класса в вашей модели данных. Скорее всего, вы создадите общий класс ListController‹E extends AbstractEntity›, но вы не сможете указать параметризованный класс в файле FXML. Вы можете назначить его во время выполнения, как вы сказали, но вы не получите проверку синтаксиса. Итог: если вы пишете только для десктопа, медлительность FXML, вероятно, вас не смущает, но ожидайте, что иногда вам придется искать обходные пути для его ограничений. Лично я просто думаю, что это недостаточно элегантно. - person Nikša Baldun; 16.01.2014
comment
@Ник Спасибо. Однако я не совсем понимаю проверку синтаксиса, разве следующее не обеспечивает ее: listCtrl = new ListController‹Person›(); а потом ты делаешь что-то с контроллером? Как насчет наличия AbstractListController, который затем расширяет контроллер fxml? - person Jurgen; 16.01.2014
comment
@Nik Может быть, это зависит от того, что вы пытаетесь сделать с универсальными контроллерами. У меня есть универсальный контроллер для взаимодействия с классами, реализующими определенный интерфейс, и он работает очень хорошо. Пользовательский интерфейс контроллера находится в FXML, а параметризованный контроллер расширяет VBox для использования в других элементах пользовательского интерфейса. (например, класс SelectTypeDialog‹T расширяет IDiscoverable› расширяет VBox...) - person chooks; 25.02.2014

Я бы добавил к списку Юргенса два контра.

Если вы работаете с FXML, создание экземпляра вашего представления неудобно. По крайней мере, с моей точки зрения.

Node explorer = new MyExplorerWidget();

or

Node explorer = cdicontainer.newInstance(MyExplorerWidget.class);

приятнее, чем

FXMLLoader loader = new FXMLLoader(getClass().getResource("com.mycompany.some.very.long.name.MyExplorerWidget.fxml"),explorerwidgetresouces);//Of course we want our app internationalized
Node explorer = loader.load();

Другое дело, что FXML статичен. Если вы хотите создать свой пользовательский интерфейс во время выполнения в зависимости от какой-либо модели, вы все равно будете писать код пользовательского интерфейса. В итоге я получил бесполезные файлы fxml, подобные этому PropertyGrid.fxml

<AnchorPane xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="PropertyGridController">
    <children>
        <VBox fx:id="vbox" layoutX="63.0" layoutY="-28.0" prefHeight="172.0" prefWidth="163.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
    </children>
</AnchorPane>

И PropertyGridController.

public class PropertyGridController{

    @FXML
    VBox vbox;

    ....

    public void setModel(PropertySheet model){
        //.... tons of code to generate the actual property grid and add it to the view
    }
}
person FuryFart    schedule 24.02.2014