[英]nullPointerException on FXML object while manually adding controllers
我正在制作一个在5x5矩形网格中构造PuzzleBlocks的应用程序。 我不再在.fxml文件中声明fx:controller,而是在main中这样做:
@Override
public void start(Stage primaryStage) throws Exception {
FXMLLoader baseViewLoader = new FXMLLoader(getClass().getResource("Views/BaseView.fxml"));
baseViewLoader.setLocation(getClass().getResource("Views/BaseView.fxml"));
baseViewLoader.setController(new DockViewController());
Parent root = baseViewLoader.load();
FXMLLoader dockLoader = new FXMLLoader(getClass().getResource("Views/DockView.fxml"));
dockLoader.setLocation(getClass().getResource("Views/DockView.fxml"));
dockLoader.setController(new DockViewController());
Parent dockView = dockLoader.load();
primaryStage.setResizable(false);
primaryStage.sizeToScene();
primaryStage.setTitle("Tiles 2059275");
Scene gameScene = new Scene(root);
primaryStage.setScene(gameScene);
primaryStage.show();
new GameController();
}
现在以前,当通过.fxml文件声明Controller来完成此操作时,DockViewController的Initialize中的这段代码可以正常工作:
@FXML
StackPane dockStackPane;
@Override
public void initialize(URL location, ResourceBundle resources) {
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
tile1 = createSquare(Color.GREY);
tile2 = createSquare(Color.GREY);
tile3 = createSquare(Color.GREY);
tile1.setTranslateX(32 * (i) - 176);
tile1.setTranslateY(32 * (j) - 48);
tile2.setTranslateX(32 * (i) - 16);
tile2.setTranslateY(32 * (j) - 48);
tile3.setTranslateX(32 * (i) + 144);
tile3.setTranslateY(32 * (j) - 48);
dockStackPane.getChildren().add(tile1);
dockStackPane.getChildren().add(tile2);
dockStackPane.getChildren().add(tile3);
puzzleBlock1.add(tile1);
puzzleBlock2.add(tile2);
puzzleBlock3.add(tile3);
}
}
System.out.println("Ini test");
}
该错误发生在dockStackPane.getChildren().add(tile1);
因为dockStackPane为null。 如果删除手动在Main中添加控制器,然后返回到在FXML文件中使用fx:controller添加控制器,则它可以正常工作。 但是然后我没有对我的控制器的引用。
DockView.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.layout.StackPane?>
<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="128.0" prefWidth="384.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1">
<children>
<StackPane fx:id="dockStackPane" prefHeight="128.0" prefWidth="384.0" />
</children>
</Pane>
DockView包含在BaseView中
感谢对我的问题的评论,我得以解决,解决方案是在我的BaseView.fxml中的include中添加一个fx:id:
<fx:include fx:id="includedDockView" source="DockView.fxml" />
确保include元素的fx:controller设置为:
<Pane fx:id="dockPane" fx:controller="tiles.Controllers.DockViewController" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="128.0" prefWidth="384.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1">
然后可以在BaseViewController中执行以下操作:
@FXML
private DockViewController includedDockViewController;
public DockViewController getDockViewController() {
return includedDockViewController;
}
在主要方面,您可以这样传递BaseView:
public void start(Stage primaryStage) throws Exception {
FXMLLoader baseViewLoader = new FXMLLoader(getClass().getResource("Views/BaseView.fxml"));
baseViewLoader.setLocation(getClass().getResource("Views/BaseView.fxml"));
baseViewLoader.setController(new BaseViewController());
Parent root = baseViewLoader.load();
primaryStage.setResizable(false);
primaryStage.sizeToScene();
primaryStage.setTitle("Tiles 2059275");
Scene gameScene = new Scene(root);
primaryStage.setScene(gameScene);
primaryStage.show();
new GameController(baseViewLoader);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.