我只是在学习JavaFX 8,如果您想在控件中显示某个东西,比如一个TableColumn,那么您需要它作为ObservableValue的一个实例,例如,一个SimpleStringProperty。
因此,在常用的Person对象中,我可能有一个"firstName“的SimpleStringProperty,然后我可以使用它作为TableColumn的值,如下所示:
TableColumn<Person, String> firstNameCol =
new TableColumn<Person, String>("First Name");
firstNameCol.setCellValueFactory(
new PropertyValueFactory<Person, String>("firstName"));但是,Person是我所称的“域”类--我的模型可以自由地引用和使用它。我不希望我的域和模型层知道/依赖于应用程序是使用JavaFX显示的事实。
我是否正确地认为,在这方面,模型/领域应该保持纯净?如果是这样的话,使用JavaFX实现这一目标的最佳方法是什么?例如,我是否应该以某种方式为域对象编写适配器类,以便用ObservableValues表示它们?
发布于 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。
避免适配器;它们只用于不能以任何方式更改的遗留代码。
相关帖子
发布于 2017-02-09 16:50:22
当然,保持域模型的纯性是明智的,而不是将其绑定到任何特定的框架,因为您可能需要在其他上下文中使用这些对象(数据库存储、在REST中公开这些对象、进行批处理等等)。
将域模型更改为使用JavaFX属性会给其他场景中需要避免的类增加许多额外负担。
然而,JavaFX有一种处理这种情况的标准方法,因此您可以轻松地将您的域模型连接到它的控件,并且它以您已经建议的方式工作,使用它的javafx.beans.property.adapter包中的适配器。
然而,使用这些适配器不会使您的控件响应域对象中的值变化,例如,它们会对SimpleStringProperty做出响应。
这将取决于您的需求,如果这是一个问题,但如果是,您可以考虑修改您的域模型对象,以添加PropertyChangeListener支持。这是一个相对较小的权重更改(相对于完整的JavaFX属性),并且不会使您依赖于JavaFX (只依赖于问题较少的java.beans )。
有关如何在JavaFX中直接使用域模型类的详细说明,请参阅此答案:具有JavaBean性质的JavaFX包装
发布于 2017-02-20 16:47:04
JRebirth的下一个版本( active dev中的8.6.0)将允许使用注释处理器从POJO (平原旧Java对象)生成这些FXJO (javaFX Java对象)。
或者直接解析ecore文件。
它可以让您有机会不改变您的业务模型与UI相关的东西,如属性。
https://stackoverflow.com/questions/42033696
复制相似问题