【问题标题】:Why does my view no longer communicate with its controller since the controller was set manually?为什么我的视图不再与它的控制器通信,因为控制器是手动设置的?
【发布时间】:2019-06-01 08:03:37
【问题描述】:

自从我手动设置控制器后,相应的视图似乎就无法识别我的控制器。我的控制器无法识别任何视图元素,它们的视图也无法识别我的控制器方法。当我将鼠标悬停在视图中的 onaction='#...eventHandler' 上时,它表示没有为顶级元素指定控制器。

但是,我已经设置了我的控制器(这是主控制器,然后在其他地方设置了另一个控制器用于弹出窗口):

FXMLLoader loader = new FXMLLoader(getClass().getResource("foodDiaryView.fxml"));
        FoodDiary foodDiary = new FoodDiary();
        FoodDiaryController controller = new FoodDiaryController(foodDiary);
        loader.setController(controller);
        Parent root = loader.load();
        primaryStage.setTitle("Food Diary");
        primaryStage.setScene(new Scene(root, 720, 480));
        primaryStage.show();

当我运行程序时,我得到了这个错误:

Exception in Application start method
java.lang.reflect.InvocationTargetException
...
Caused by: java.lang.NullPointerException at sample.FoodDiaryController.initialize(FoodDiaryController.java:72)

巧合的是,第一行代码引用了视图中的一个元素:

@FXML private TableView<Food> breakfastTable;

然后在初始化(line 72)导致NullPointerException

breakfastTable.setItems(foodDiary.getBreakfastFoods());

谁能暗示为什么会发生这种情况?

先决条件:

  • 我必须手动设置我的控制器,因为我的控制器没有使用无参数构造函数。
  • 我正在使用 IntelliJ

【问题讨论】:

  • @kleopatra 我在发布之前确实阅读了此指南,但我真的不知道问题出在哪里,因此无法提供示例。将其上传到 Github 存储库并链接是个好主意吗?如果没有,你有什么建议?
  • 简单地生成一个简短的例子,在手动设置控制器之后/之前有/没有问题并将其发布在这里:)
  • @GeorgeBaker foodDiaryView.fxml 丢失(将示例限制为根元素和&lt;TableView&gt;),查看FoodDiaryController 涉及的部分也将是有益的(breakfastTable 声明,@987654332 @ 构造函数中的声明和赋值,initialize 部分设置项目)。还要通过最小化示例来确保您没有删除导致问题的部分。为暂时不生产 MCVE 投票赞成...

标签: javafx model-view-controller nullpointerexception javafx-8 fxml


【解决方案1】:

我可能错了,我现在无法检查,但我记得使用 setController 和 setControllerFactory 时的一些问题。我认为当您在 FXML 中指定 fx:controller 时,您不能使用 setController 但必须使用 setControllerFactory 或类似的东西。

【讨论】:

猜你喜欢
  • 2018-01-30
  • 1970-01-01
  • 2019-12-18
  • 2012-10-07
  • 1970-01-01
  • 2015-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多