Javafx: включение компонента внутри другого - PullRequest
0 голосов
/ 06 марта 2019

Я использую 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.
...