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>
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With