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);
});
}