子控制器丢失了从主控制器传递的数据
Subcontroller loses passed data from MainController
我已经搜索这个问题好几天了,但找不到解决方案。
我有一个应该包含 ArrayList 的 MainController。当我启动应用程序时,SubController 应该在 MainController 的 initialize()
方法中初始化。它确实有效,但如果我尝试从 SubController 中的另一个方法引用 MainController 中的 ArrayList,我总是得到 NullPointerExeption
,我不知道为什么。
这是我的代码。
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>
第一个 Syso
工作正常并为我提供了正确的值,但正如我所说,第二个总是有一个 NullPointerExeption
。有没有人知道如何修复它?
JavaFX 将自己创建一个控制器实例 class,如果您想使用您在代码中创建的实例,您需要将此实例传递给相应的 FXMLLoader
通过它的 setController
方法。
您正在创建一个 Controller1
class 的新实例,该实例未与任何 fxml 一起使用,而不是使用与包含的 fxml 一起使用的实例。要将包含的 fxml 的控制器注入包含 <fx:include>
的 fxml 的控制器字段,该字段的名称需要是 <fx:include>
元素的 fx:id
与 [= 连接15=] 即在你的情况下
@FXML
private Controller1 tab1Controller;
我已经搜索这个问题好几天了,但找不到解决方案。
我有一个应该包含 ArrayList 的 MainController。当我启动应用程序时,SubController 应该在 MainController 的 initialize()
方法中初始化。它确实有效,但如果我尝试从 SubController 中的另一个方法引用 MainController 中的 ArrayList,我总是得到 NullPointerExeption
,我不知道为什么。
这是我的代码。
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>
第一个 Syso
工作正常并为我提供了正确的值,但正如我所说,第二个总是有一个 NullPointerExeption
。有没有人知道如何修复它?
JavaFX 将自己创建一个控制器实例 class,如果您想使用您在代码中创建的实例,您需要将此实例传递给相应的 FXMLLoader
通过它的 setController
方法。
您正在创建一个 Controller1
class 的新实例,该实例未与任何 fxml 一起使用,而不是使用与包含的 fxml 一起使用的实例。要将包含的 fxml 的控制器注入包含 <fx:include>
的 fxml 的控制器字段,该字段的名称需要是 <fx:include>
元素的 fx:id
与 [= 连接15=] 即在你的情况下
@FXML
private Controller1 tab1Controller;