首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaFX 8:模型/域与视图的分离

JavaFX 8:模型/域与视图的分离
EN

Stack Overflow用户
提问于 2017-02-03 22:00:20
回答 3查看 1.2K关注 0票数 2

我只是在学习JavaFX 8,如果您想在控件中显示某个东西,比如一个TableColumn,那么您需要它作为ObservableValue的一个实例,例如,一个SimpleStringProperty

因此,在常用的Person对象中,我可能有一个"firstName“的SimpleStringProperty,然后我可以使用它作为TableColumn的值,如下所示:

代码语言:javascript
复制
TableColumn<Person, String> firstNameCol = 
            new TableColumn<Person, String>("First Name");
firstNameCol.setCellValueFactory(
            new PropertyValueFactory<Person, String>("firstName"));

但是,Person是我所称的“域”类--我的模型可以自由地引用和使用它。我不希望我的域和模型层知道/依赖于应用程序是使用JavaFX显示的事实。

我是否正确地认为,在这方面,模型/领域应该保持纯净?如果是这样的话,使用JavaFX实现这一目标的最佳方法是什么?例如,我是否应该以某种方式为域对象编写适配器类,以便用ObservableValues表示它们?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-02-11 21:21:37

为什么要避免使用任何JavaFX类?

JavaFX属性(在javafx.beans.property包中找到)只是对常规JavaBeans属性的扩展。

它们是JavaFX属性和绑定框架的一部分,它不依赖JavaFX工具包实现其功能,也不要求应用程序利用JavaFX UI类来构建其图形用户界面。因此,它可以作为代码中任何地方的独立工具使用,而不必担心模型/域被耦合到视图的特定实现中。

您应该考虑到JavaFX属性和绑定框架是一个通用实用程序,由于它的性质,它本质上是视图实现的独立工具,就像任何其他通用库(例如番石榴)一样。例如,您可以在任何时候切换到Swing应用程序,同时仍然继续使用它。

但是,如果您仍然倾向于在可能的情况下不使用它的功能,那么就有一种情况是可以这样做的:如果所呈现的内容不会改变(例如,域类中的表模型对应的状态是不可变的),那么按照PropertyValueFactory 文档,就会出现标准的属性获取器。

尝试调用get<property>()is<property>()时会有失败的支持。如果存在匹配此模式的方法,则此方法返回的值将包装在ReadOnlyObjectWrapper中并返回给TableCell。但是,在这种情况下,这意味着TableCell将无法观察更改的ObservableValue

避免适配器;它们只用于不能以任何方式更改的遗留代码。

相关帖子

票数 2
EN

Stack Overflow用户

发布于 2017-02-09 16:50:22

当然,保持域模型的纯性是明智的,而不是将其绑定到任何特定的框架,因为您可能需要在其他上下文中使用这些对象(数据库存储、在REST中公开这些对象、进行批处理等等)。

将域模型更改为使用JavaFX属性会给其他场景中需要避免的类增加许多额外负担。

然而,JavaFX有一种处理这种情况的标准方法,因此您可以轻松地将您的域模型连接到它的控件,并且它以您已经建议的方式工作,使用它的javafx.beans.property.adapter包中的适配器。

然而,使用这些适配器不会使您的控件响应域对象中的值变化,例如,它们会对SimpleStringProperty做出响应。

这将取决于您的需求,如果这是一个问题,但如果是,您可以考虑修改您的域模型对象,以添加PropertyChangeListener支持。这是一个相对较小的权重更改(相对于完整的JavaFX属性),并且不会使您依赖于JavaFX (只依赖于问题较少的java.beans )。

有关如何在JavaFX中直接使用域模型类的详细说明,请参阅此答案:具有JavaBean性质的JavaFX包装

票数 5
EN

Stack Overflow用户

发布于 2017-02-20 16:47:04

JRebirth的下一个版本( active dev中的8.6.0)将允许使用注释处理器从POJO (平原旧Java对象)生成这些FXJO (javaFX Java对象)。

或者直接解析ecore文件。

它可以让您有机会不改变您的业务模型与UI相关的东西,如属性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42033696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档