【问题标题】:How to send/load data from a Tab through a controller to another Tab in a MVVM pattern (JavaFx 8)如何通过控制器将数据从选项卡发送/加载到 MVVM 模式中的另一个选项卡(JavaFx 8)
【发布时间】:2025-12-30 18:00:16
【问题描述】:

我在 JavaFx 8 中开发了一个项目,我可以在其中将数据从一个选项卡发送或加载到另一个选项卡。现在我想以 MVV 模式开发相同的项目。 现在我为每个选项卡和主控制器制作了一个视图、视图模型和模型,它应该处理其他选项卡。

Tab1

我可以在 tab1 和 tab2 中设置文本,但我不知道如何构建主控制器模型/模型视图来处理从 tab1 到 tab2 的数据。如果我想将mainconcontrollerview绑定到maincontrollermodel,由于fxml注解我不能。

在主控制器视图中包含其他两个视图。我提供了类和 fxml 文档,以便更好地理解我到目前为止所做的事情以及我的问题可能出在哪里

MVVM TabTest link

【问题讨论】:

    标签: mvvm tabs javafx-8 fxml


    【解决方案1】:

    与其尝试重新发明*,不如看看一个框架,它实现了 MVVM 模式并为组件之间的通信提供了必要的手段。

    https://github.com/sialcasa/mvvmFX

    【讨论】:

      【解决方案2】:

      1) 您的代码中存在一些关于 MVVM 的误解。 MVVM 中的“视图”由两部分组成:FXML 文件和一个“CodeBehind”类。 codeBehind 类是具有对带有 @FXML 注释的 UI 控件的引用的类。然后,codeBehind 类将 UI 控件连接到 ViewModel 的属性。所以你的“viewmodel”包中的类实际上是属于“View”的codeBehind类。您的“模型”包中的类实际上是您的“视图模型”。

      2) 在您的示例中,每个选项卡 codeBehind 类都引用了主 codeBehind 类,而主 codeBehind 引用了每个选项卡 codeBehind,这意味着您的耦合非常紧密。对于父组件,可以知道它是子组件,但子组件不应该知道它们在哪里以及如何使用。

      3) 我是mvvmFX 框架的开发人员之一。就像mipa 说的那样,这个框架为这种情况提供了一些帮助程序和实用程序。我认为有两种方法可以做到这一点:

      1. 您应该使用dependency-injection。这样,在主视图模型中,您可以获得对两个选项卡视图模型的引用并将它们连接起来,而无需 codeBehind 类相互了解。
      2. 在框架的最后一个版本中,我们引入了一个我们称之为“作用域”的 beta 特性。它基本上是一个缩进的类,用于保存多个视图模型使用的数据。 ViewModel 可以注入作用域实例并使用这些数据(例如通过数据绑定)。这样 ViewModel 不需要直接了解其他 ViewModel,而只知道 Scope 实例。稍后添加新选项卡时,无需更改现有类。你可以找到更多here

      【讨论】:

        最近更新 更多