JavaFX Nested Controller с конструктором, вызывающим "NullPointerException: Root не может быть пустым"

Создание javafx11 fxml gui. Существует основной fxml "testingScreen" и "BinaryIndicator", которые я включил в "TestingScreen" каждый со своими соответствующими контроллерами. Контроллер BinaryIndicator требует некоторых данных, требующих конструктора. Это работает нормально, пока я не добавлю fx: id во включенный BinaryIndicator внутри TestingScreen. Так что все это работает без fx: id для BinaryIndicator, но это не позволяет мне управлять им из контроллера TestingScreen, который мне нужен для конструктора. Тогда мой прогон Gradle отвечает с ошибкой

 "Caused by: java.lang.NullPointerException: Root cannot be null
    at javafx.graphics/javafx.scene.Scene.<init>(Scene.java:345)
    at javafx.graphics/javafx.scene.Scene.<init>(Scene.java:236)
    at com.team871.FXMLGraphicalMain.start(FXMLGraphicalMain.java:32)"

Мой основной:

public class FXMLGraphicalMain extends Application {


    @Override
    public void start(Stage primaryStage) {
        Parent root = null;

        try {
            root = FXMLLoader.load(getClass().getClassLoader().getResource("FXML/TestScreen.fxml"));
        } catch (IOException e) {
            System.out.println("Failed to load the FXML file!");
        }

        primaryStage.setTitle("Test 1");
        primaryStage.setScene(new Scene(root, 720, 480));
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }

Мой основной документ TestingScreen FXML:

 <AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.172-ea" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.team871.controllers.TestScreen">
   <children>
      <Button fx:id="button" layoutX="71.0" layoutY="21.0" mnemonicParsing="false" onAction="#handleButtonClick" text="Hello?" />
      <fx:include fx:id="binaryIndicator" source="/FXML/modules/BinaryIndicator.fxml"/>
   </children>
</AnchorPane>

Контроллер TestingScreen:

@FXML public Button button;

    @FXML public BinaryIndicator binaryIndicator;

    public TestScreen(){
        binaryIndicator = new BinaryIndicator();
    }


    @FXML private void initialize() {
    }

    public void handleButtonClick(){
        System.out.println("hello");
    }

BinaryIndicator FXML:

<VBox alignment="CENTER" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="76.0" prefWidth="57.0" xmlns="http://javafx.com/javafx/8.0.172-ea" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.team871.controllers.modules.BinaryIndicator">
   <children>
      <Label fx:id="label" text="Title" />
      <Circle fx:id="circle" fill="#fff01f" radius="25.0" stroke="BLACK" strokeType="INSIDE" />
      <Region prefHeight="26.0" prefWidth="57.0" />
   </children>
</VBox>

Контроллер BinaryIndicator:

public BinaryIndicator(){
    this(new ColorMode(true), new BinaryDataValue(false), "null");
}

public BinaryIndicator(ColorMode colorMode, IData<Boolean> data, String title) {
    this.colorMode = colorMode;
    this.title = title;
    this.data = data;


    label = new Label(this.title + ":");
    label.setTextFill(colorMode.getSecondaryColor());
    label.setAlignment(Pos.CENTER);
    label.setPadding(new Insets(5, 0, 3, 0));

    circle = new Circle();
    setNeutral();


    //Updates:
    colorMode.addListener(observable -> {
        label.setTextFill(colorMode.getSecondaryColor());
    });

    data.addListener((observable, old, newValue) -> {
        setState(newValue);
    });
}

0 ответов

Другие вопросы по тегам