过去,我不止一次实现了类似于 JavaFX 提供的属性和侦听器。
由于我总是更喜欢使用广泛支持的包而不是我自己发明的东西,所以我很想在我的下一个项目中使用 JavaFX 属性,但在此之前,我想得到以下问题的答案。
在与 GUI 无关但会受益于更改侦听器以监视和控制系统状态的软件中,我是否仍应选择 JavaFX 提供的属性机制,还是有其他可用的东西对我有用?...还是我还需要自己实现这个机制?
问候,弗雷德里克
过去,我不止一次实现了类似于 JavaFX 提供的属性和侦听器。
由于我总是更喜欢使用广泛支持的包而不是我自己发明的东西,所以我很想在我的下一个项目中使用 JavaFX 属性,但在此之前,我想得到以下问题的答案。
在与 GUI 无关但会受益于更改侦听器以监视和控制系统状态的软件中,我是否仍应选择 JavaFX 提供的属性机制,还是有其他可用的东西对我有用?...还是我还需要自己实现这个机制?
问候,弗雷德里克
在商业产品上使用非 UI 相关逻辑的 javaFX 属性大约一年后,这是我的两分钱:
混合 UI 相关属性和业务逻辑相关属性可能不是一个好主意。
如果两种类型都不必相互交互,它会很好用。但是,当您开始将 UI 元素绑定到业务逻辑属性时,就会出现问题。原因是您通常会在专用线程中运行业务逻辑代码,如果此线程更新属于绑定一部分的属性,您将收到以下异常:
java.lang.IllegalStateException:不在 FX 应用程序线程上;
简单的解决方法是移动更改属性值的代码块
Platform.runLater(...)
调用...但是您在业务逻辑代码中有一些依赖于 javaFX 框架的代码。因此,如果您在 Swing 应用程序中重复使用此代码,或者只是想通过 JUnit 测试对其进行测试,您也会在此处遇到错误:
java.lang.IllegalStateException:工具包未初始化
由于您使用的是需要初始化 JavaFX 工具包的 Platform.runLater(),因此在单元测试或 swing/javaee 应用程序中并非如此。
总而言之,可以对非 UI 代码使用 javafx 属性,但它可能会产生不小的副作用......
JavaFX 属性机制应该可以工作。它们是为支持 JavaFX GUI 而编写的,但对于非 gui 逻辑也应该可以正常工作——尽管我认为到目前为止还没有广泛用于该目的。我无法与其他竞争框架谈论哪个可以更好地满足您的需求。
当您看到 JavaFX 中用于属性支持的类的数量时,这可能有点令人生畏,但它们往往可以很好地结合在一起,并且存在许多类来屏蔽对象/原始阻抗不匹配。遗憾的是,这些功能没有更好的语言支持。使用 IDE 和自动完成功能进行编程非常有效,因此您无需输入太多内容。侦听器折叠成 jdk8 lambda 表达式,因此它们最终可以非常简洁。
绑定和侦听器框架是允许 JavaFX 控件如此容易地适应和利用的一部分——它们为系统的每个项目提供了更改通知的挂钩。
JavaDoc可用。不幸的是,关于绑定和集合的官方文档在彻底描述如何使用它的功能集方面没有做到图书馆公正。有一篇关于将JavaFX 属性与 POJO 结合使用的有用文章。
JavaFX 的 bean、绑定和属性支持的源代码尚未公开(尽管计划在接下来的几个月内公开)。
使用高于 jdk7u6 的 Java 版本并确保jfxrt.jar
分发中的文件位于您的类路径中,以便您选择 JavaFX 类。如果您不使用任何 GUI 组件,则无需Application
在程序中扩展 JavaFX 类。
要考虑的相关非 GUI 包是:
javafx.beans
包 javafx.beans 包含定义最通用的可观察性形式的接口。
javafx.beans.binding
绑定的特征
javafx.beans.property
包 javafx.beans.property 定义了只读属性和可写属性,以及一些实现。
javafx.beans.property.adapter
(使标准 pojo bean 适应 JavaFX 属性)。
javafx.beans.value
包 javafx.beans.value 包含两个基本接口 ObservableValue 和 WritableValue 及其所有子接口。
javafx.animation
为易于使用的基于过渡的动画(与时间相关的非 gui 部分)提供一组类。
javafx.collections
包含基本的 JavaFX 集合和集合实用程序
javafx.util.converter
此包适用于 JavaFX 的标准字符串转换器。