当前位置: 首页 > 知识库问答 >
问题:

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

葛阳
2023-03-14

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

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

在我的“模型”类中,我显然使用了来自Java Collections API的各种列表、映射和其他类。为了让我的程序的用户操作这些底层列表和地图,我想使用JavaFX中的可观察(列表/地图)接口。

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

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

一种幼稚的方法是为TableView使用ObservableList<MachineMonitor>,并保留对my ArrayList<MachineMonitor>的使用。但是,根据JavaFX规范,对ObservableList<MachineMonitor>所做的更改不会影响底层列表。

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

这种临时解决方案似乎非常凌乱和不理想。

共有1个答案

颜昕
2023-03-14

简而言之,我不认为ObservableList的使用违反了MVC契约。

其余的,你可以读,也可以不读,因为它很长,很烦人。

建筑格局背景

如果你想要一个非常简单的框架,它遵循模型、视图和演示者的风格,那么一定要给Afterburner.fx一个旋转。

我认为体系结构的正确选择取决于您的应用程序、您的经验以及您试图解决的问题的大小和复杂性。例如,如果您有一个分布式系统,那么您可以遵循REST原则,而不是(或者除了)MVC。无论您选择哪一种,架构都应该帮助您解决手头的问题(以及可能的未来问题),而不是相反。过度构建解决方案是一个常见的陷阱,而且很容易做到,所以要尽量避免。

警告

对于使用observables构建的简单JavaFX应用程序,请参见tic-tac-toe。

有关使用基于FXML的组件构造大型复杂JavaFX应用程序的好方法,请参阅SceneBuilder和SceneBuilderKit的源代码。源代码可在JavaFX mercurial源代码树中获得,只需查看并开始学习即可。

阅读JavaFX UI控件体系结构。检查JavaFX控件源代码(例如,Button和ButtonSkin或ListView和ListViewSkin)以了解如何使用JavaFX结构应用MVC之类的概念。在此基础上,尝试使用JavaFX控件框架提供的体系结构创建一些您自己的自定义控件。通常,在构建自己的应用程序时,不需要创建自己的控件(至少是从JavaFX控件派生的控件)。JavaFX控件体系结构是精心设计的,以支持构建可重用控件的库,因此它不一定适用于所有目的;相反,它提供了一个具体的演示,证明了一种可以完成某些事情的方法。采用和调整经过验证的解决方案可以确保您不会不必要地重新发明东西,并允许您建立在坚实的基础上,从其他人的试验中学习。

也许可以使用ReadOnlyListWrapper将MachineMonitor中的ObservableList公开给外部世界,这样就没有任何东西可以对其进行不适当的修改。

设置封装视图的其他结构(例如ControlPanel和ControlPanelSkin),并为其提供对MachineMonitors的只读可观察列表的引用。ControlPanelSkin可以封装TableView、图形或任何可视化旋钮和小部件,供用户用来监视机器。

使用这样的结构可以有效地将视图与模型隔离开来。模型实际上根本不了解UI,ControlPanelSkin实现可以在完全不改变核心MachineMonitor系统的情况下改为完全不同的可视化表示或技术。

 类似资料:
  • 问题内容: 我正在尝试研究JavaFX,因为我想将其用作程序的GUI。我的问题本质上是一个概念性的问题: 到目前为止,我的程序主要是MVC模式的“模型”部分。也就是说,从类的意义上讲,几乎所有我的代码都是抽象的OO表示,而所有这些代码都是逻辑代码。 由于我不想成为程序的唯一用户,因此我想添加MVC的“视图”部分,以便人们可以轻松使用和操纵程序的“模型”部分。为此,我想使用JavaFX。 在我的“模

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

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

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

  • 我正在为Laravel CRUD controller使用一个背包,我试图找出是否有一种有效的方法来判断模型是否已更新,而无需同时加载当前模型和更新的模型,然后比较属性值。

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