0

我已经搜索了这个问题好几天了,但找不到解决方案。我有一个 MainController,它应该包含一个 ArrayList。当我启动应用程序时,应该在initialize()MainController 的方法中初始化子控制器。它确实有效,但是如果我尝试从 SubController 中的另一个方法引用 MainController 中的 ArrayList,我总是会得到一个NullPointerExeption,但我不知道为什么。这是我的代码。

控制器.java:

public class Controller {

    public ArrayList<Film> filme = new ArrayList<Film>();

    @FXML Controller1 controller1 = new Controller1();

    ...

    @FXML
    public void initialize() {
        ...
        controller1.init(this);
        ...
    }

    ...
}

拉赫门.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>

控制器1.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>

第一个Syso工作得很好,给了我正确的值,但正如我所说,第二个总是有NullPointerExeption. 有没有人知道如何修复它?

4

2 回答 2

1

您正在创建一个Controller1不与任何 fxml 一起使用的类的新实例,而不是使用与包含的 fxml 一起使用的实例。要将包含的 fxml 的控制器注入到控制器的字段中,包含<fx:include>字段名称的 fxml 需要是与ie连接fx:id<fx:include>元素,在您的情况下"Controller"

@FXML
private Controller1 tab1Controller;
于 2018-08-12T03:22:01.280 回答
0

JavaFX 将自行创建控制器类的实例,如果要使用在代码中创建的实例,则需要FXMLLoader通过其setController方法将此实例传递给相应的实例。

于 2018-08-11T19:18:16.147 回答