Reputation: 13
I have searched this problem for days now and can't find a solution.
I have a MainController which is supposed to hold an ArrayList. When I start the Application the SubController is supposed to be initialised in the initialize()
method of the MainController. It does work, but if i try to refer on the ArrayList from the MainController from another method in the SubController I always get a NullPointerExeption
and I have no idea why.
Here is my Code.
Controller.java:
public class Controller {
public ArrayList<Film> filme = new ArrayList<Film>();
@FXML Controller1 controller1 = new Controller1();
...
@FXML
public void initialize() {
...
controller1.init(this);
...
}
...
}
Rahmen.fxml:
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane xmlns:fx="http://javafx.com/fxml/1"
xmlns="http://javafx.com/javafx/8" fx:controller="GUI.Controller"
fx:id="test">
<!-- TODO Add Nodes -->
<fx:include fx:id="tab1" source="StartBildschirm.fxml" />
</AnchorPane>
Controller1.java:
public class Controller1 {
private Controller main;
@FXML private Pane film1;
public void init(Controller controller) {
main = controller;
System.out.println(main.filme.get(0).getTitel());
}
@FXML
public void test(MouseEvent e) {
System.out.println(main.filme.get(0).getTitel());
}
...
}
StartBildschirm.fxml:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.text.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane prefWidth="1040.0" xmlns="http://javafx.com/javafx/8"
xmlns:fx="http://javafx.com/fxml/1" fx:controller="GUI.Controller1">
...
</AnchorPane>
The first Syso
works just fine and gives me the correct value, but as I said, the second one always has a NullPointerExeption
. Does anyone has an idea on how to getting it fixed?
Upvotes: 0
Views: 37
Reputation: 82461
You're creating a new instance of the Controller1
class that is not used with any fxml instead of using the instance used with the included fxml. To inject the controller of a included fxml to a field of the controller for the fxml containing the <fx:include>
the name of the field needs to be the fx:id
of the <fx:include>
element concatenated with "Controller"
i.e. in your case
@FXML
private Controller1 tab1Controller;
Upvotes: 1
Reputation: 14493
JavaFX will create an instance of the controller class on its own, if you want to use an instance you created in your code, you need to pass this instance to the respective FXMLLoader
via its setController
method.
Upvotes: 0