我已经多次在这里搜索过答案,但没有得到我的解决方案。
就我而言: 我想从用户那里获取输入并检查有效性。如果一切正常,我将从数据库中获取用户 ID 并将 ID 发送到另一个FXML,然后使用 ID 运行选择查询将结果显示在tableView中。
在第二个FXML(控制器)中,我使用 initialize()方法将数据设置为tableView,并使用setId()方法从先前的FXML接收用户 ID 。但是,在setId()方法之前调用initialize()方法,并且因为ID为null,所以不提供我所需的结果。
使用Passing Parameters JavaFX FXML此方法在FXML之间传递数据。
最佳解决方案是什么?
仅供参考:目前我正在使用带有静态变量的额外类来存储ID。
答案 0 :(得分:1)
您可以使用控制器工厂在返回控制器实例之前初始化id:
FXMLLoader loader = new FXMLLoader(url);
loader.setControllerFactory(c -> {
MyController controller = new MyController();
controller.setId(userId);
return controller;
});
...
Node n = loader.load();
这样你也可以使用类作为控制器,它们不提供默认的构造函数。可以使用更复杂的控制器工厂来连接模型和演示者(see MVP)。
另一种方法是使用setId
方法而不是initialize
方法修改场景的内容,这比使用控制器工厂更简单。
最佳解决方案取决于您的需求和个人喜好。但是,如果可能,应避免使用static
成员传递数据。