我正在尝试研究 JavaFX,因为我想将它用作我的程序的 GUI。我的问题本质上是一个概念问题:
迄今为止,我的程序主要是 MVC 模式的“模型”部分;也就是说,我的几乎所有代码都是类意义上的抽象的面向对象表示,并且所有这些代码都是逻辑代码。
由于我不想成为我的程序的唯一用户,我想添加 MVC 的“视图”部分,以便人们可以轻松地使用和操作我的程序的“模型”部分。为此,我想使用 JavaFX。
在我的“模型”类中,我显然使用了 Java 集合 API 中的各种列表、地图和其他类。为了让我的程序的用户操作这些底层列表和地图,我想在 JavaFX 中使用 Observable(List/Map) 接口。
一个使情况更清晰的具体示例:
假设我有一个MachineMonitor类,它每 3 分钟检查一次机器的某些属性,例如连接是否仍然良好,齿轮转动的速度等。如果满足某些不等式(比如说齿轮已降至 1 转/秒的速率)MachineMonitor触发 RestartMachineEvent。
目前我使用 ArrayList< MachineMonitor > 来跟踪所有单个MachineMonitor的。现在扩展到 MVC 的“视图”部分,我希望用户能够操作显示 MachineMonitor 列表的 TableView,以便他们可以创建和删除新的MachineMonitor以监控各种机器。
这样我就可以跟踪我的程序的用户想要做什么(例如,为机器#5 创建一个MachineMonitor,检查齿轮的转数/秒是否低于 0.5)我使用 ObservableList< MachineMonitor > 作为TableView 的基础列表。
链接我的程序的“模型”和“视图”的最简单方法是将“模型”类更改为具有 ObservableList< MachineMonitor > 而不是 ArrayList< MachineMonitor > 但是(进入问题的主题)我觉得这很混乱,因为它混合了“模型”和“视图”代码。
一种天真的方法是对 TableView 使用 ObservableList< MachineMonitor > 并保留我的 ArrayList< MachineMonitor > 的使用。但是,根据 JavaFX 规范,对 ObservableList< MachineMonitor > 所做的更改不会影响基础列表。
鉴于此,解决这个难题的最佳方法是为 ObservableList< MachineMonitor > 创建一个 ChangeListener,它将对 ObservableList< MachineMonitor >所做的更改“传播”到底层“模型”ArrayList< MachineMonitor >?也许把它放在一个名为 MachineMonitorController 的类中?
这种临时解决方案似乎非常混乱且不理想。
我的问题是:在这种情况下,保持“模型”和“视图”之间几乎完全分离的最佳方法是什么?