【问题标题】:JAVAFX: Passing data between FXML not WorkingJAVAFX:在 FXML 之间传递数据不起作用
【发布时间】:2016-01-06 22:08:18
【问题描述】:

我已经在这里搜索了好几次答案,但没有得到我的解决方案。

就我而言: 我想从用户那里获取输入并检查有效性。如果一切正常,我将从数据库中获取用户 ID 并将该 ID 发送到另一个 FXML,然后使用该 ID 在那里运行选择查询并将结果显示到 tableView 中。

在第二个 FXML(控制器)中,我使用 initialize() 方法将数据设置到 tableView 中,并使用 setId() 方法从以前的 FXML 接收用户 ID。但是,initialize() 方法在 setId() 方法之前被调用,并且由于 ID 为空,因此没有提供我需要的结果。

使用Passing Parameters JavaFX FXML这个方法在FXML之间传递数据。

什么是最好的解决方案?

仅供参考:目前我正在使用带有静态变量的额外类来存储 ID。

【问题讨论】:

  • 可以在setId()上设置tableview的数据。
  • 感谢您的提示。它有效:D

标签: java javafx javafx-8 fxml


【解决方案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 成员传递数据。

【讨论】:

  • 在这种情况下使用setController 而不是setControllerFactory。如果你真的想使用setControllerFactory,你需要更加小心,因为你会破坏<fx:include>s(以一种非常可怕的方式)(包含的FXML文件使用相同的控制器工厂来创建它们的控制器实例) .
猜你喜欢
  • 1970-01-01
  • 2013-05-20
相关资源
最近更新 更多