FXMLLoader getController returns NULL?

自古美人都是妖i 提交于 2019-11-26 06:46:45

问题


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>

回答1:


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



来源:https://stackoverflow.com/questions/23461148/fxmlloader-getcontroller-returns-null

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!