Подтвердить что ты не робот

Вложенные контроллеры JavaFx (FXML <include>)

В this tutotial приведен пример того, как включать настраиваемые компоненты и использовать их контроллеры из контроллера контейнера.

main_window_content.fxml

<VBox fx:controller="com.foo.MainController">
   <fx:include fx:id="dialog" source="dialog.fxml"/>
   ...
</VBox>

MainController.java

public class MainController extends Controller {
    @FXML private Window dialog;
    @FXML private DialogController dialogController;

    ..

Если компонент включен только один раз, он работает нормально. Если один и тот же компонент включен дважды, контроллеры не инициализируются. Оба контроллера имеют нулевое значение.

main_window_content.fxml

    <VBox fx:controller="com.foo.MainController">
       <fx:include fx:id="dialog1" source="dialog.fxml"/>
       <fx:include fx:id="dialog2" source="dialog.fxml"/>
       ...
    </VBox>

MainController.java

    public class MainController extends Controller {
        @FXML private Window dialog1;
        @FXML private DialogController dialogController1;
        @FXML private Window dialog2;
        @FXML private DialogController dialogController2;

Может ли кто-нибудь помочь мне решить проблему? спасибо

Это мой код загрузки FXML. Он выполняется в основном методе приложения:

public void start(Stage stage) throws Exception { 
    Parent root = FXMLLoader.load(getClass().getResource("main_window_content.fxml"));
    stage.setTitle("FXML Welcome"); 
    stage.setScene(new Scene(root, 300, 275));
    stage.show(); 
}
4b9b3361

Ответ 1

Благодаря Daniel (от OTN) я обнаружил ошибку в моем коде, имена моих переменных контроллера были неправильными. Они должны быть <fx:id>Controller. Другими словами, это должно быть:

MainController.java

public class MainController extends Controller {
@FXML private Window dialog1;
@FXML private DialogController dialog1Controller;
@FXML private Window dialog2;
@FXML private DialogController dialog2Controller;

Но изучая изменения , представленные в версии 2.2, я обнаружил, что все можно легко решить, используя тег <fx:root>  (как этот учебник). Я ввел свой компонент в FXML, просто объявив его следующим образом:

<HBox>
    <Dialog id="dialog1" text="Hello World!"/>
    <Dialog id="dialog2" text="Hello World!"/>
</HBox>

Я надеюсь быть полезным

Ответ 2

Кажется, что ошибка в netbeans 8.0 с вложенными fxmls. Невозможно рассчитывать на netbeans для создания вложенного объекта контроллера fxml для вас, его нужно вручную вставить в свой MainController. Каждый раз, когда контроллер обновляется в netbeans, он уничтожается, поэтому он может быть утомительным. Для этого примера, который будет вставлять

@FXML private DialogController dialog1Controller;

вручную в главном контроллере в этом случае, тогда он работает нормально. Очень полезно для организации больших fxmls/контроллеров.