如何使用 Spring Boot + FXVeawer 在 JavaFX 阶段之间正确传输变量

How to transfer variables correctly between JavaFX stages with Spring Boot + FXVeawer

我正在尝试在我的项目中使用依赖注入,以便我可以在场景之间传输数据。例如,在一个控制器中,我得到了名为 proj_idInteger 字段。我在舞台上通过一些逻辑得到了这个。当我改变我的舞台时,我想通过新的舞台控制器访问这个变量。新控制器具有相同的字段 Integer proj_id.

我用 @Autowired 标记了它们的字段,但我不明白 Bean 在控制器更改时如何存储值。我用构造函数、getter 和 setter 创建了实体 Curr_proj,我假设它是一个 Component 来存储变量,但仍然不起作用。

这不是一个具体的答案,只是一个笼统的、没有重点的答案,可能有助于提供一个总体方向。也许我最终会把信息移到别处。如果对您没有用,请忽略此答案。

我的建议:学习spring。

Baeldung、spring.io 和其他网站拥有大量专门用于教学的资源 spring。好好利用它们。

遵循使用 spring 引导应用程序的现代做法。忽略任何不使用最新 spring 版本或依赖 xml 配置的旧教程。

另外:学习 JavaFX

Oracle、eden coding、makery 和 openjfx.io 都有很好的学习 JavaFX 的教程。

独立完成这两件事。然后在这两种技术中独立开发 non-trivial 自己的应用程序。

在尝试集成 JavaFX 和 Spring 之前就这样做。 JavaFX与Spring的交集,优质资源少得多,需要多研究,多努力,多开发才能完成整合。

只有在您对这两种技术都有很好的应用知识(而不仅仅是基本的了解)之后,才可以尝试开发另一个使用这两种技术的应用程序。

与其他 Spring 技术不同,目前,您不能仅使用 Spring Initializr 生成的应用程序遵循一些常用教程并期望有一个有用的工作应用程序集成了 Spring 和 JavaFX.

IMO,集成并不太难,对许多应用程序来说都是值得的,但我不建议在没有两种技术(Spring 和 JavaFX)的全面经验的情况下构建集成应用程序,因为它们是如此不同,尽管它们是互补的。

更具体地解决您的问题:遵循 javafx mvc 中的体系结构,但在模型层中使用 spring 服务和 bean,并将它们注入您的控制器。

如果您通过 rest 与服务器通信,请使用 spring rest 客户端和数据传输对象。

如果您有本地数据库,请使用 spring 数据。

实体 classes 或数据传输对象可以构成 mvc 中模型的一部分,或者您可以为 mvvm 架构创建具有 JavaFX 属性的单独视图模型 classes。

对于与 jpa 基本集成的本地数据库应用程序,请参阅:

整体架构类似于此 eden SQLite JavaFX app,尽管那不是 spring。它演示了所涉及的组件。替换为 spring 技术,例如spring 数据、注入、spring 启动应用程序等各种组件和接线。

综上所述,控制器中数据之间的相互通信被抽象为MVC或MVVM架构,通过依赖注入使用spring服务和bean。整个应用程序不仅仅是 MVC,还具有其他组件和技术,例如:

  • spring 开机管理:

    • Spring 应用生命周期
    • Spring组件配置
    • 读取应用程序属性配置文件
  • JavaFX 应用程序管理的 JavaFX 应用程序生命周期class

  • fxml 控制器中的 UI 视图

    • spring 本地数据库的数据

    • spring 休息访问远程系统上的 Web 服务。

当自动连接控制器时,使用控制器 bean 的原型作用域。有关详细信息,请参阅:

目前 JavaFX 17 是模块化的,但 spring boot 2 不是。这使得集成更加困难。

对于许多开发人员来说,JavaFX 与 Spring 的集成目前超出了他们作为开发人员的舒适范围。

未来的可能性

将来spring boot 3 将是模块化的。

希望也可以将启动器依赖项添加到 Spring Initializr,以便轻松生成新的 JavaFX spring 项目。

然后将其与 Maven 中良好的模块化和插件构建支持相结合,gradle 通过 jlink 和 jpackage 打包模块化应用程序。

同时添加良好的 IDE 新项目向导支持以使用这两个框架生成新项目。

还提供有关使用新技术的 Spring 和 JavaFX 集成的优秀教程。

以上所有的组合有望使技术的集成和部署更容易获得。

好的,非常感谢您的回答,但我的 JavaFX 知识并不像您想象的那么糟糕。我同意,我必须更加努力,我现在正在学习 Spring。

我进行了一些研究,在我的情况下在场景之间传输变量非常容易,因为我使用 FXVeawer 所以我的控制器已经是 Spring Components.

所以,在我的 FirstController 中,我只需在 proj_ij 字段中添加一个 getter

public Integer proj_id;

public void SomeMethod() {
proj_id = 5;
}
Integer getProj_id() {
    return proj_id;
}

完成后,我刚刚在我的 SecondController public FitstController FirstController 中创建了一个字段,并且简单的构造函数 injcection 完成了这个技巧:

@Autowired
public void get_projid(FirstController FirstController) {
    this.FirstController = FirstController;
}

现在,我可以通过在 Second Controller

中键入 FirstController.getProj_id 来访问我的 proj_id