当前位置: 首页 > 面试题库 >

JavaFX中ObservableList的使用是否违反了模型-视图-控制器的分隔?

宗安翔
2023-03-14
问题内容

我正在尝试研究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属性的方法;但是,我真的看不到有任何方法可以使它们成为视图的一部分)。

另外,如果你这样做

List<MachineMonitor> myNonObservableList = ... ;

ObservableList<MachineMonitor> myObservableList = FXCollections.observableList(myNonObservableList);
myObservableList.add(new MachineMonitor());

可观察列表由不可观察列表支持,因此也会发生更改myNonObservableList。因此,您可以根据需要使用此方法。



 类似资料:
  • 到目前为止,我的程序主要是MVC模式的“模型”部分;也就是说,我几乎所有的代码都是类意义上抽象的OO表示,所有这些代码都是逻辑代码。 由于我不想成为我的程序的唯一用户,我想添加MVC的“视图”部分,以便人们可以轻松地使用和操作我的程序的“模型”部分。为此,我想使用JavaFX。 在我的“模型”类中,我显然使用了来自Java Collections API的各种列表、映射和其他类。为了让我的程序的用

  • CodeIgniter 的开发基于 MVC(模型-视图-控制器)设计模式。MVC 是一种 用于将应用程序的逻辑层和表现层分离出来的软件方法。在实践中,由于这种分离 所以你的页面中只包含很少的 PHP 脚本。 模型 代表你的数据结构。通常来说,模型类将包含帮助你对数据库进行增删改查的方法。 视图 是要展现给用户的信息。一个视图通常就是一个网页,但是在 CodeIgniter 中, 一个视图也可以是一

  • 我需要修改我的代码,使它成为一个模型-视图-控制器。因为我是一个完全的编程新手,如果我诚实的话,我会头疼。任何帮助如何做到这一点将不胜感激。 *在一个牧场上有200只忙碌的绵羊。这群羊由95只白羊、60只黑羊和45只白黑羊组成。牧羊人现在想把它们分开,这样相应的羊毛就可以按颜色剪了。帮他写一个小脚本,这样他就可以更好地点他的羊了。请使用变量、数组、数学运算符和函数实现前三点。提示:为了更好地概述,

  • 在iOS中,将嵌套视图控制器的视图放在UIViewController的视图中通常是一种糟糕的编程实践吗?比如说,我想有一种互动元素来响应用户的触摸,但只占屏幕的25%。 我想我会将这个嵌套视图控制器添加到UIViewController中,方法如下:

  • 模型视图控制器是最常用的设计模式。 开发人员发现实现这种设计模式很容易。 以下是模型视图控制器的基本架构 - 现在让我们看看结构是如何工作的。 模型 (Model) 它由纯应用程序逻辑组成,它与数据库交互。 它包括向最终用户表示数据的所有信息。 View View表示与最终用户交互的HTML文件。 它向用户表示模型的数据。 控制器 (Controller) 它充当视图和模型之间的中介。 它侦听由视

  • 根据方法<code>java.util.concurrent的约定。未来#取消: 此方法返回后,对 isDone 的后续调用将始终返回 true。 Netty的Future接口扩展了它: 所以Netty应该遵守合同。但事实上Netty没有。您可以运行以下示例代码: 控制台应打印: 真 但实际上它打印: 假 以下方法也违反了合同: 我已经在github上创建了一个问题:问题 但是我仍然想在stack