Я использую eclipse e4 и javafx в своем приложении, и я хотел бы кое-что сделать, но не могу найти способ добиться этого.
У меня есть компонент, состоящий из Части и Контроллера (назовем его PartA и ControllerA), и я хочу, чтобы его можно было использовать отдельно в MWindow или встраивать в другой компонент (B) посредством включения, как это.
A.fxml:
<fx:root fx:id="mainVBox" type="VBox" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="my.package.ControllerA">
<children> ... </children>
</fx:root>
B.fxml
<fx:root type="VBox" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="my.package.ControllerB">
<children>
<SplitPane>
<items>
<AnchorPane />
<AnchorPane >
<children>
<fx:include source="A.fxml" />
</children>
</AnchorPane>
</items>
</SplitPane>
</children>
</fx:root>
Я пытаюсь загрузить контроллер с PartA и PartB, просто расширяя этот класс:
public class WindowPart<CONTROLLER> {
protected ResourceBundle resources;
public WindowPart() {
this.resources = ResourceBundle.getBundle("i18n.bundle", Locale.getDefault(), this.getClass().getClassLoader());
}
@PostConstruct
public void postConstruct(BorderPane parent, MPart part) throws IOException
{
FXMLLoader loader = new FXMLLoader(getClass().getResource(computeFxmlFilename(getClass())));
loader.setResources(resources);
loader.setClassLoader(this.getClass().getClassLoader());
VBox vbox = new VBox();
parent.setCenter(vbox);
loader.setRoot(vbox);
}
}
И он работает правильно, когда я загружаю только компонент A, но когда я пытаюсь загрузить компонент B, у меня появляется эта ошибка:
Caused by: javafx.fxml.LoadException: Root hasn't been set. Use method setRoot() before load.
/my/package/A.fxml:13
/my/package/B.fxml:13
Так что я не уверен, что это хороший способ сделать это, и если да, то почему или как я могу установить root во встроенном компоненте.
РЕДАКТИРОВАТЬ: я понимаю, что я использовал fx: root на обоих компонентах, я думаю, что он должен использоваться только на A. Таким образом, я удалил его на B и теперь имеет противоположную ошибку:
javafx.fxml.LoadException: Root value already specified.