Вложенные контроллеры 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();
}
Ответы
Ответ 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/контроллеров.