Java 手动添加控制器时FXML对象上的nullPointerException
我正在制作一个应用程序,其中拼图块被构建在一个由5x5个矩形组成的网格中。我不再在.fxml文件中声明fx:controller,而是在main中声明:Java 手动添加控制器时FXML对象上的nullPointerException,java,javafx,nullpointerexception,fxml,Java,Javafx,Nullpointerexception,Fxml,我正在制作一个应用程序,其中拼图块被构建在一个由5x5个矩形组成的网格中。我不再在.fxml文件中声明fx:controller,而是在main中声明: @Override public void start(Stage primaryStage) throws Exception { FXMLLoader baseViewLoader = new FXMLLoader(getClass().getResource("Views/BaseView.fxml"));
@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文件声明控制器时,DockViewController初始化中的这段代码将正常工作:
@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");
}
DockView包含在BaseView中多亏了对我的问题的评论,我才能够解决这个问题。解决方案是在我的BaseView中的include中添加一个fx:id。fxml:
<fx:include fx:id="includedDockView" source="DockView.fxml" />
在主视图中,您可以传递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);
}
@费边
@FXML StackPane dockStackPane代码>在我尝试使用它时返回null。现在我已经手动分配了控制器。如果我改为在视图中通过fx:controller添加控制器,那么它确实可以工作。但是我没有对我的dockviewcontroller的引用为什么两个控制器使用相同的控制器类?两个FXML文件是否都有dockStackPane
?异常是否在baseViewLoader.load()
或dockLoader.load()
期间发生?@James\u D在dockLoader.load()期间发生,因为此时它正在尝试初始化。再一次,当我在DockView.fxml中的pane元素上将fx:controller设置为DockViewController时,该代码工作正常。“并且DockView包含在BaseView中”。你能详细说明一下吗?您是否使用
?
是否也在BaseView.fxml
中FXMLLoader
不会将包含的fxml中的字段注入包含的fxml的控制器。我使用fx:INCLUDE,因为StackPane不在BaseView中。fxml代码的最后一行没有任何作用:除此之外,这看起来是正确的方法。
<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">
@FXML
private DockViewController includedDockViewController;
public DockViewController getDockViewController() {
return includedDockViewController;
}
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);
}