我正在尝试研究JavaFX,因为我想将其用作程序的GUI。我的问题本质上是一个概念性的问题:
到目前为止,我的程序主要是MVC模式的“模型”部分。也就是说,从类的意义上讲,几乎所有我的代码都是抽象的OO表示,而所有这些代码都是逻辑代码。
由于我不想成为程序的唯一用户,因此我想添加MVC的“视图”部分,以便人们可以轻松使用和操纵程序的“模型”部分。为此,我想使用JavaFX。
在我的“模型”类中,我显然使用了Java Collections API中的各种List,Map和其他类。为了让程序的用户能够操纵这些底层的列表和映射,我想使用JavaFX中的Observable(List / Map)接口。
一个具体的例子可以使情况变得清晰:
假设我有一个 MachineMonitor 类,该类每3分钟检查一次Machine的某些属性,例如连接是否仍然良好,齿轮旋转的速度等。如果满足某些不等式(例如,齿轮下降到1转/秒的速率) MachineMonitor 触发RestartMachineEvent。
当前,我使用ArrayList < MachineMonitor >跟踪所有单独的 MachineMonitor 。现在扩展到MVC的“视图”部分,我希望用户能够操纵显示 MachineMonitor 列表的TableView,以便他们可以例如创建和删除新的 MachineMonitor 来监视各种计算机。
为了跟踪程序用户的 意图 (例如,为5号机器创建一个 MachineMonitor ,以检查齿轮的转数/秒是否低于0.5),我使用了ObservableList < MachineMonitor >作为TableView的基础列表。
链接程序的“模型”和“视图”的最简单方法是将“模型”类更改为具有ObservableList < MachineMonitor
而不是ArrayList < MachineMonitor >,但是(进入问题的主题)我觉得这很混乱,因为它混合了“模型”和“视图”代码。
天真的方法是将ObservableList < MachineMonitor >用于TableView并保留对ArrayList < MachineMonitor >的使用。但是,根据JavaFX规范,对ObservableList < MachineMonitor
所做的更改不会影响基础列表。
鉴于此,是为了解决这一难题,以便为ObservableList <一个ChangeListener的最佳方式 MachineMonitor
该“传播”更改到ObservableList <制成 MachineMonitor >到底层“模型”的ArrayList < MachineMonitor >?也许将其放在名为MachineMonitorController的类中?
这种临时解决方案似乎非常混乱且不理想。
我的问题是:在这种情况下,保持“模型”和“视图”之间几乎完全分离的最佳方法是什么?
我不同意ObservableList在您的“模型”类中使用会违反MVC分离。An ObservableList纯粹是数据表示;它是模型的一部分,而不是视图的一部分。我(和 其他人)在应用程序所有层的模型表示中使用JavaFX属性和集合。在其中的其他内容中,我指出了如何使用(或至少可以)绑定到JSF的JavaFX属性。(我应该提一下,并不是每个人都同意在服务器端使用FX属性的方法;但是,我真的看不到有任何方法可以使它们成为视图的一部分)。
ObservableList
另外,如果你这样做
List<MachineMonitor> myNonObservableList = ... ; ObservableList<MachineMonitor> myObservableList = FXCollections.observableList(myNonObservableList); myObservableList.add(new MachineMonitor());
可观察列表由不可观察列表支持,因此也会发生更改myNonObservableList。因此,您可以根据需要使用此方法。
myNonObservableList