【问题标题】:Should I use something else in non-gui applicaiton logic than the mechanisms that javafx.beans.property provides?除了 javafx.beans.property 提供的机制之外,我是否应该在非 gui 应用程序逻辑中使用其他东西?
【发布时间】:2012-12-20 11:33:38
【问题描述】:

过去,我不止一次实现了类似于 JavaFX 提供的属性和侦听器。

由于我总是更喜欢使用广泛支持的包而不是我自己发明的东西,所以我很想在我的下一个项目中使用 JavaFX 属性,但在此之前,我想得到以下问题的答案。

在与 GUI 无关但会受益于更改侦听器以监视和控制系统状态的软件中,我是否仍应选择 JavaFX 提供的属性机制,或者是否有其他可用的东西对我有用? ...还是我还需要自己实现这个机制?

问候, 弗雷德里克

【问题讨论】:

    标签: java properties javafx-2 observable changelistener


    【解决方案1】:

    在商业产品上使用 javaFX 属性用于非 UI 相关逻辑大约一年后,这是我的两分钱:

    混合 UI 相关属性和业务逻辑相关属性可能不是一个好主意。

    如果两种类型都不必相互交互,它会很好用。但是当您开始将 UI 元素绑定到业务逻辑属性时,就会出现问题。原因是您通常会在专用线程中运行业务逻辑代码,如果此线程更新属于绑定一部分的属性,您将收到以下异常:

    java.lang.IllegalStateException:不在 FX 应用程序线程上;

    那么简单的解决方法是移动更改属性值的代码块

    Platform.runLater(...)

    call... 但是您在业务逻辑代码中有一些依赖于 javaFX 框架的代码。因此,如果您在 Swing 应用程序中重复使用此代码,或者只是想通过 JUnit 测试对其进行测试,也会出现错误:

    java.lang.IllegalStateException:工具包未初始化

    由于您使用的是需要初始化 JavaFX 工具包的 Platform.runLater(),因此在单元测试或 swing/javaee 应用程序中并非如此。

    总而言之,可以对非 UI 代码使用 javafx 属性,但它可能会产生不小的副作用...

    【讨论】:

      【解决方案2】:

      JavaFX 属性机制应该可以工作。它们是为支持 JavaFX GUI 而编写的,但对于非 gui 逻辑也应该可以正常工作——尽管我认为到目前为止还没有广泛用于该目的。我无法与其他竞争性框架讨论哪种框架可以更好地满足您的需求。


      当您看到 JavaFX 中用于属性支持的类的数量时,这可能有点令人生畏,但它们往往可以很好地结合在一起,并且存在许多类来屏蔽对象/原始阻抗不匹配。遗憾的是,这些功能没有更好的语言支持。使用 IDE 和自动完成功能进行编程非常有效,因此您无需输入太多内容。侦听器折叠成 jdk8 lambda 表达式,因此它们最终可以非常简洁。

      绑定和侦听器框架是允许 JavaFX 控件如此容易地适应和利用的一部分 - 它们为系统的每个项目提供更改通知的挂钩。

      JavaDoc 可用。不幸的是,bindingscollections 上的官方文档在彻底描述如何使用它的功能集方面没有做到图书馆公正。有一篇关于使用JavaFX properties with POJOs 的有用文章。

      JavaFX 的 bean、绑定和属性支持的源代码尚未公开(尽管计划在未来几个月内公开)。


      使用高于 jdk7u6 的 Java 版本并确保分发中的 jfxrt.jar 文件位于您的类路径中,以便您选择 JavaFX 类。如果您不使用任何 GUI 组件,则无需在程序中扩展 JavaFX Application 类。


      需要考虑的相关非 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 的标准字符串转换器。

      【讨论】:

        猜你喜欢
        • 2017-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-04
        • 2014-02-10
        • 2011-06-11
        • 2020-10-14
        相关资源
        最近更新 更多