JavaFX8:模型/域与视图的分离
我正在学习JavaFX8。似乎如果您想在控件中显示某个内容,例如a TableColumn
,您需要该内容作为ObservableValue
的实例,例如a SimpleStringProperty
因此,在常用的Person
对象中,我可能有一个SimpleStringProperty
作为“firstName”,然后我可以使用它作为TableColumn
的值,如下所示:
TableColumn<Person, String> firstNameCol =
new TableColumn<Person, String>("First Name");
firstNameCol.setCellValueFactory(
new PropertyValueFactory<Person, String>("firstName"));
但是,Person
是我所说的“域”类——我的模型可以自由引用和使用它。我不希望我的域和模型层意识到/依赖于应用程序使用JavaFX显示的事实
我认为模型/领域在这方面应该保持纯洁,这是对的吗?如果是这样,使用JavaFX实现这一点的最佳方法是什么?例如,我是否应该以某种方式为我的域对象编写适配器类,用ObservableValues
表示它们
# 1 楼答案
为什么要避免使用任何JavaFX类
JavaFX属性(位于^{} 包中)只是常规JavaBeans属性的扩展
它们是JavaFX属性和绑定框架的一部分,该框架不依赖JavaFX工具包来实现其功能,也不要求应用程序利用JavaFX UI类来构建其图形用户界面。 因此,它可以作为代码中任何地方的独立工具使用,而不必担心模型/域与视图的这个特定实现相耦合
您应该考虑JavaFX属性和绑定框架,这是一个通用的工具,它本质上与视图的实现无关,就像任何其他通用库(例如番石榴)一样。例如,您可以随时切换到Swing应用程序,同时仍继续使用它
但如果您仍然希望在可能的情况下不利用其功能,那么您实际上可以这样做: 如果呈现的内容不会改变(例如,与域类中的表模型相对应的状态是不可变的),并且存在标准属性获取程序,那么,根据
PropertyValueFactory
documentation:避免使用适配器;它们只用于不能以任何方式更改的遗留代码
相关帖子
# 2 楼答案
保持域模型的纯粹性当然是明智的,不要将其绑定到任何特定的框架,因为您可能需要在其他上下文中使用这些对象(数据库存储、在REST API中公开它们、执行批处理等)
将域模型更改为使用JavaFX属性会给那些在其他场景中需要避免的类增加很多额外负担
然而,JavaFX确实有一种处理这种情况的标准方法,因此您可以轻松地将域模型连接到它的控件,并且它以您已经建议的方式工作,使用其
javafx.beans.property.adapter
包中的适配器然而,使用这些适配器不会使控件像使用
SimpleStringProperty
之类的适配器那样,对域对象中的值更改做出响应这将取决于您的需求,如果这是一个问题,但是如果您可以考虑修改您的域模型对象以添加^ {CD3>}支持。这是一个相对较轻的更改(相对于完整的JavaFX属性),不会让您依赖JavaFX(只依赖于问题较少的
java.beans
)有关如何直接在JavaFX中使用域模型类的详细说明,请参见以下答案:JavaBean wrapping with JavaFX Properties
# 3 楼答案
JRebirth的下一个版本(active dev中的8.6.0)将允许使用注释处理器从POJO(普通旧Java对象)生成这些FXJO(javaFX Java对象)
或者直接解析ecore文件
它可以让你有机会不改变你的商业模式与用户界面相关的东西,如属性