有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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表示它们


共 (3) 个答案

  1. # 1 楼答案

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

    JavaFX属性(位于^{}包中)只是常规JavaBeans属性的扩展
    它们是JavaFX属性和绑定框架的一部分,该框架不依赖JavaFX工具包来实现其功能,也不要求应用程序利用JavaFX UI类来构建其图形用户界面。 因此,它可以作为代码中任何地方的独立工具使用,而不必担心模型/域与视图的这个特定实现相耦合

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

    但如果您仍然希望在可能的情况下不利用其功能,那么您实际上可以这样做: 如果呈现的内容不会改变(例如,与域类中的表模型相对应的状态是不可变的),并且存在标准属性获取程序,那么,根据PropertyValueFactorydocumentation

    There is fall-through support for attempting to call get<property>() or is<property>(). If a method matching this pattern exists, the value returned from this method is wrapped in a ReadOnlyObjectWrapper and returned to the TableCell. However, in this situation, this means that the TableCell will not be able to observe the ObservableValue for changes.

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

    相关帖子

  2. # 2 楼答案

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

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

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

    然而,使用这些适配器不会使控件像使用SimpleStringProperty之类的适配器那样,对域对象中的值更改做出响应

    这将取决于您的需求,如果这是一个问题,但是如果您可以考虑修改您的域模型对象以添加^ {CD3>}支持。这是一个相对较轻的更改(相对于完整的JavaFX属性),不会让您依赖JavaFX(只依赖于问题较少的java.beans

    有关如何直接在JavaFX中使用域模型类的详细说明,请参见以下答案:JavaBean wrapping with JavaFX Properties

  3. # 3 楼答案

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

    或者直接解析ecore文件

    它可以让你有机会不改变你的商业模式与用户界面相关的东西,如属性