java - 在 JavaFX 中使用 ObservableList 是否违背了模型- View - Controller 分离?

标签 java model-view-controller arraylist javafx observablelist

我正在尝试研究 JavaFX,因为我想将它用作我程序的 GUI。我的问题本质上是一个概念性的问题:

迄今为止,我的程序主要是 MVC 模式的“模型”部分;也就是说,几乎我所有的代码都是类意义上的抽象的 OO 表示,并且所有这些代码都是逻辑代码。

由于我不想成为我程序的唯一用户,我想添加 MVC 的“ View ”部分,以便人们可以轻松地使用和操作我的程序的“模型”部分。为此,我想使用 JavaFX。

在我的“模型”类中,我显然使用了 Java 集合 API 中的各种列表、映射和其他类。为了让我的程序的用户操作这些底层列表和映射,我想使用 JavaFX 中的 Observable(List/Map) 接口(interface)。

一个使情况变得清晰的具体示例:

假设我有一个 MachineMonitor 类,每 3 分钟检查一次 Machine 的某些属性,例如连接是否仍然良好,齿轮转动的速度等。如果遇到某些不等式(例如齿轮已下降到 1 转/秒的速度)MachineMonitor 触发 RestartMachineEvent。

目前我使用 ArrayList 来跟踪所有单独的 MachineMonitor。现在扩展到 MVC 的“ View ”部分,我希望用户能够操作一个显示 MachineMonitor 列表的 TableView,以便他们可以,例如,创建和删除新的 MachineMonitor 来监控各种机器。

这样我就可以跟踪我的程序的用户想要做什么(例如,为 Machine #5 创建一个 MachineMonitor 来检查齿轮的转数/秒是否低于 0.5)我使用 ObservableList 作为TableView 的基础列表。

链接我的程序的“模型”和“ View ”的最简单方法就是将“模型”类更改为 ObservableList 而不是 ArrayList 但是(进入问题的主题)我觉得这很乱,因为它混合了“模型”和“ View ”代码。

一种天真的方法是为 TableView 使用 ObservableList 并保留使用我的 ArrayList。但是,根据 JavaFX 规范,对 ObservableList 所做的更改不会影响基础列表。

鉴于此,解决这个难题的最佳方法是为 ObservableList 创建一个 ChangeListener ,它将对 ObservableList 所做的更改“传播”到基础“模型”ArrayList?也许把它放在一个叫做 MachineMonitorController 的类中?

这种临时解决方案看起来非常困惑且不理想。

我的问题是:在这种情况下,在“模型”和“ View ”之间保持几乎完全分离的最佳方法是什么?

最佳答案

我不同意使用 ObservableList在您的“模型”类中违反了 MVC 分离。安 ObservableList纯粹是数据表示;它是模型的一部分,而不是 View 的一部分。我 ( and others ) use JavaFX properties and collections in model representations in all tiers of my applications .在那里,我指出了我如何使用绑定(bind)到(或至少可以)绑定(bind)到 JSF 的 JavaFX 属性。 (我应该提到,并不是每个人都同意在服务器端使用 FX 属性的方法;但是我真的看不出有任何方法可以证明它们在某种程度上是 View 的一部分。)
另外,如果你这样做

List<MachineMonitor> myNonObservableList = ... ;

ObservableList<MachineMonitor> myObservableList = FXCollections.observableList(myNonObservableList);
myObservableList.add(new MachineMonitor());
可观察列表由不可观察列表支持,因此更改发生在 myNonObservableList也。因此,如果您愿意,可以使用这种方法。

关于java - 在 JavaFX 中使用 ObservableList 是否违背了模型- View - Controller 分离?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23643898/

相关文章:

java - 如何从android中的一个Arraylist中获取单独的数据项值

java - Java 1.8 版本的 Maven 安装问题

asp.net-mvc-3 - 是否有一种自动方法可以在 MVC 中查找未使用的 View ?

java - 扫描到文件中

c# - ASP.NET MVC 与 Winforms MVC

model-view-controller - 如何命名 Controller 和模型之间的层 codeigniter MVC

java - 在创建 ArrayList 时添加元素

JAVA错误: "E/MediaPlayer: Error (-38,0)"

java - 处理 "Usage: PApplet [options] <class name> [sketch args]"

java - 将具有不同值的 N 个项目分配到组中,只有当组中项目的总和为 D 时才有效