Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

FXMLLoader getController returns NULL?

Tags:

I have the main application class that does the following just fine:

   @Override    public void start(Stage primaryStage) {       try {          FXMLLoader loader = new FXMLLoader(getClass().getResource(                "RecordScreen.fxml"));          Parent root = (Parent) loader.load();          Scene newScene = new Scene(root);          Stage newStage = new Stage();          newStage.setScene(newScene);          newStage.show();       } catch (Exception e) {          e.printStackTrace();       }    } 

It launches a table view that displays people. I select a person, hit the edit button, and try to launch a window that will let me edit them.

   @FXML    public void editPerson() {       try {          FXMLLoader loader = new FXMLLoader(getClass().getResource(                "PersonEditor.fxml"));          PersonEditorCtrl ctrl = loader.getController();          ctrl.init(table.getSelectionModel().getSelectedItem());          Parent root = (Parent) loader.load();          Scene newScene = new Scene(root);          Stage newStage = new Stage();          newStage.setScene(newScene);          newStage.show();       } catch (Exception e) {          e.printStackTrace();       }    } 

The problem is, getController is returning null. I have been following this pattern for the past 2 weeks with no problems whatsoever. What am I doing wrong now? These untraceable bugs are aggravating!!!

Here are my two fxmls:

The screen with tableview:

<AnchorPane xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="application.RecordsCtrl">   <!-- TODO Add Nodes -->   <children>     <VBox id="VBox" alignment="CENTER" spacing="0.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">       <children>         <TableView fx:id="table" prefHeight="-1.0" prefWidth="-1.0">           <columns>             <TableColumn prefWidth="75.0" text="Name" fx:id="nameCol" />             <TableColumn prefWidth="75.0" text="Age" fx:id="ageCol" />           </columns>         </TableView>         <Button mnemonicParsing="false" onAction="#editPerson" text="Edit" />       </children>     </VBox>   </children> </AnchorPane> 

The person editor:

<AnchorPane xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="application.PersonEditorCtrl">   <!-- TODO Add Nodes -->   <children>     <VBox layoutX="0.0" layoutY="0.0" prefHeight="-1.0" prefWidth="-1.0">       <children>         <TextField fx:id="nameField" prefWidth="200.0" />         <TextField fx:id="ageField" prefWidth="200.0" />         <Button mnemonicParsing="false" text="Button" />       </children>     </VBox>   </children> </AnchorPane> 
like image 556
Toni_Entranced Avatar asked May 04 '14 20:05

Toni_Entranced


Video Answer


1 Answers

Change this

@FXML    public void editPerson() {       try {          FXMLLoader loader = new FXMLLoader(getClass().getResource(                "PersonEditor.fxml"));          PersonEditorCtrl ctrl = loader.getController();          ctrl.init(table.getSelectionModel().getSelectedItem());          Parent root = (Parent) loader.load();          Scene newScene = new Scene(root);          Stage newStage = new Stage();          newStage.setScene(newScene);          newStage.show();       } catch (Exception e) {          e.printStackTrace();       }    } 

To that:

@FXML    public void editPerson() {       try {          FXMLLoader loader = new FXMLLoader(getClass().getResource(                "PersonEditor.fxml"));          Parent root = (Parent) loader.load();          PersonEditorCtrl ctrl = loader.getController();          ctrl.init(table.getSelectionModel().getSelectedItem());           Scene newScene = new Scene(root);          Stage newStage = new Stage();          newStage.setScene(newScene);          newStage.show();       } catch (Exception e) {          e.printStackTrace();       }    } 

You first have to run loader.load() then you can get the Controller.

Patrick

like image 198
Patrick Avatar answered Nov 09 '22 00:11

Patrick