Как загрузить несколько FXML в один класс?

Я создаю несколько компонентов с помощью SceneBuilder, теперь моя цель — использовать все эти файлы для создания полного окна. Но я не могу загрузить несколько FXML, вот что я пытаюсь сделать:

    private MenuBar menuBar;
    private Pane filtersView;

    FXMLLoader loader = new FXMLLoader();

    loader.setLocation(MainWindow.class.getResource("../component/menuBar/MenuBar.fxml"));
    menuBar = (MenuBar) loader.load();

    loader.setLocation(MainWindow.class.getResource("../component/filtersView/FiltersView.fxml"));
    filtersView = (Pane) loader.load();

Вот ошибка возврата :

Корневое значение уже указано.

Должен ли я создавать загрузчик для каждого компонента?


person Evans Belloeil    schedule 24.04.2015    source источник
comment
Да. Каждый раз создавайте новый загрузчик.   -  person James_D    schedule 24.04.2015
comment
Не могли бы вы ответить и сказать мне, почему?   -  person Evans Belloeil    schedule 24.04.2015


Ответы (1)


Экземпляр FXMLLoader имеет ряд взаимозависимых свойств (таких как root и controller), которые устанавливаются либо путем разбора файла FXML, либо программно. Каждый из них также по-разному взаимодействует с картой namespace, хранящейся в экземпляре FXMLLoader.

Поскольку жизненный цикл FXMLLoader был бы очень сложным, если бы его можно было использовать повторно, будет ошибкой устанавливать root или controller более одного раза. (Что должно произойти с controller, если root было установлено новое значение? Что насчет свойств в namespace?).

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

FXMLLoader menuLoader = new FXMLLoader();

menuLoader.setLocation(MainWindow.class.getResource("../component/menuBar/MenuBar.fxml"));
menuBar = (MenuBar) menuLoader.load();

FXMLLoader filtersLoader = new FXMLLoader();
filtersLoader.setLocation(MainWindow.class.getResource("../component/filtersView/FiltersView.fxml"));
filtersView = (Pane) filtersLoader.load();
person James_D    schedule 24.04.2015
comment
Кстати, документации для FXMLLoader практически не существует. - person James_D; 24.04.2015