在模型类中使用 javafx.beans 属性

2023-11-26

在模型类中使用 JavaFX beans 属性是否正确?

我想知道在模型类中使用属​​性以便能够更轻松地将它们与视图组件绑定是否是一个好习惯。我并不担心这些库将来的可用性,因为我的程序将在 JRE8 或更高版本上运行,但在模型类中使用 JavaFX 库的性质让我持怀疑态度,我担心当前和未来的不兼容性,特别是因为我想使用 Hibernate 来保存这些属性。

注意:我使用纯 JavaFX 环境,并且我的应用程序中永远不需要 Swing 兼容性。


在这里我想提出一些不同意见。

JavaFX 属性和 JPA

正如我对 Jewelsea 的答案的评论,只要您使用“属性访问”而不是“字段访问”,就可以将基于 JavaFX 属性的 bean 与 JPA 一起使用。这博客文章我链接那里对此进行了更详细的介绍,但基本思想是任何注释都应该在get...()方法而不是在田野上。据我所知,这确实阻止了将任何只读 JavaFX 属性模式与 JPA 结合使用,但我从来没有真正感觉到 JPA 与只读属性(即 get 方法和无 set 方法)配合得很好。

序列化

与我对jewelsea的答案的评论相反,并且得益于几周的时间来处理这个问题(并且我面临着使用JavaFX属性在JavaFX客户端上复制多个实体类的情况),我认为缺乏JavaFX 属性序列化的问题可以解决。关键的观察是,您实际上只需要序列化属性的包装状态(例如,不需要任何侦听器)。您可以通过实施来做到这一点java.io.Externalizable. Externalizable是一个子接口Serializable这需要您填写readExternal(...) and writeExternal(...)方法。可以实现这些方法来仅外部化属性所包装的状态,而不是属性本身。这意味着如果您的实体被序列化然后反序列化,您最终将得到一个新的属性实例,并且任何侦听器都不会被保留(即侦听器实际上变成transient),但据我所知,这将是任何合理用例中所需要的。

我尝试了以这种方式定义的 bean,一切似乎都运行良好。此外,我还进行了一个小实验,使用 Jackson 映射器在 JSON 表示形式之间进行转换,在客户端和 Restful Web 服务之间传输它们。由于映射器仅依赖于使用 get 和 set 方法,因此效果很好。

一些注意事项

有几点需要注意。与任何序列化一样,有一个无参构造函数很重要。当然,JavaFX 属性包装的所有值本身都必须是可序列化的——这与任何可序列化 bean 的规则相同。

关于 JavaFX 属性通过副作用发挥作用的观点已得到充分理解,并且在将这些属性(在某种程度上是考虑到单线程模型而设计的)移动到潜在的多线程服务器时需要小心。一个好的经验法则可能是,如果您使用此策略,侦听器应该只在客户端注册(请记住,这些侦听器对于传输回服务器来说是瞬态的,无论是通过序列化还是通过 JSON 表示)。当然,这表明在服务器端使用这些可能是一个糟糕的设计;它变成了拥有一个“为所有人提供一切”的单一实体(JavaFX 客户端的可观察属性,可序列化以实现持久性和/或远程访问,以及 JPA 的持久映射)的便利性与公开功能之间的权衡(例如可观察性)可能不完全合适(在服务器上)。

最后,如果您确实使用 JPA 注释,那么它们具有运行时保留,这意味着(我认为)您的 JavaFX 客户端将需要类路径上的 javax.persistence 规范)。

这是这样一个“四季皆宜的男人”实体的示例:

import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.time.MonthDay;

import javafx.beans.property.IntegerProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

/**
 * Entity implementation class for Entity: Person
 *
 */
@Entity

public class Person implements Externalizable {


    private static final long serialVersionUID = 1L;

    public Person() {

    }

    public Person(String name, MonthDay birthday) {
        setName(name);
        setBirthday(birthday);
    }

    private final IntegerProperty id = new SimpleIntegerProperty(this, "id");

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    public int getId() {
        return id.get();
    }

    public void setId(int id) {
        this.id.set(id);
    }

    public IntegerProperty idProperty() {
        return id ;
    }

    private final StringProperty name = new SimpleStringProperty(this, "name");

    // redundant, but here to indicate that annotations must be on the property accessors:
    @Column(name="name")
    public final String getName() {
        return name.get();
    }

    public final void setName(String name) {
        this.name.set(name);
    }

    public StringProperty nameProperty() {
        return name ;
    }

    private final ObjectProperty<MonthDay> birthday = new SimpleObjectProperty<>();

    public final MonthDay getBirthday() {
        return birthday.get();
    }

    public final void setBirthday(MonthDay birthday) {
        this.birthday.set(birthday);
    }

    public ObjectProperty<MonthDay> birthdayProperty() {
        return birthday ;
    }

    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeInt(getId());
        out.writeObject(getName());
        out.writeObject(getBirthday());
    }

    @Override
    public void readExternal(ObjectInput in) throws IOException,
            ClassNotFoundException {
        setId(in.readInt());
        setName((String) in.readObject());
        setBirthday((MonthDay) in.readObject());
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在模型类中使用 javafx.beans 属性 的相关文章

  • import java 导入错误:没有名为 java 的模块

    我似乎遇到了障碍 根本无法解决这个问题 任何人都可以帮我弄清楚为什么我无法导入 java 模块吗 Error Traceback most recent call last File datasource config py line 3
  • 如何将参数传递给Workmanager DoWork方法

    我想安排任务在 24 小时后从数据库中删除 public class WorkManager extends Worker public WorkManager NonNull Context context NonNull WorkerP
  • 将 java 方法参数设置为最终参数

    那有什么区别final在下面的代码之间进行 将参数声明为有什么好处final public String changeTimezone Timestamp stamp Timezone fTz Timezone toTz return pu
  • 如何知道内存中是否已经存在类的实例?

    如何知道内存中是否已经存在类的实例 我的问题是 如果存在类实例 则不想读取方法 这是我的代码 private void jButton java awt event ActionEvent evt PNLSpcMaster pnlSpc n
  • 为 tableView JavaFx 中没有第一个(行数)的列设置 CONSTRAINED_RESIZE_POLICY

    我的 tableView 的第一列为行号 我想为没有第一个列的所有列设置 CONSTRAINED RESIZE POLICY I made First column implementation column setPrefWidth 40
  • 如何在 Android 中签署 AAR Artifacts?

    我目前正在开发一个 AAR android 库 我想用我自己的密钥对已发布的工件进行签名 以便我可以确定我是否发布了具有相同名称和功能的假 aar 注意事项1 我希望能够以编程方式检查我的库的真实性 即使是一个伪造的库 只是伪造了我的 aa
  • 是否有任何理由使用 ZoneId.of("UTC") 而不是 ZoneOffset.UTC ?

    有什么理由使用ZoneId of UTC 代替ZoneOffset UTC 我们知道两者之间的区别 如ZoneOffset UTC 和 ZoneId of UTC 之间有什么区别 https stackoverflow com questi
  • 简单的Java程序插入USB热点后速度慢100倍

    我有以下Java程序 class Main public static void main String args throws java io IOException long start System nanoTime java io
  • 覆盖乔达一周的第一天?

    是否有可能覆盖乔达弱的第一天sunday 因为 Joda 使用Monday作为一周的第一天 如果有办法的话 谁能解释一下 我在 SOF 中提到了以下主题 乔达时间 一周的第一天 https stackoverflow com questio
  • 是否有适用于 Java 的 CalDAV 客户端库? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想使用 CalDAV 协议与我的日
  • String.intern() 线程安全吗

    我想在Java中使用 String intern 来节省内存 对具有相同内容的字符串使用内部池 我从不同的线程调用这个方法 这是个问题吗 对你的问题的简短回答是肯定的 它是线程安全的 但是 您可能需要重新考虑使用此工具来减少内存消耗 原因是
  • org.apache.poi 中的异常

    我试图编写一个可以读取和写入的程序 xlsx文件中 下面提供的代码旨在能够编写其第一个 Excel 程序 package excel reader import java io FileOutputStream import java io
  • 更改JavaFX TableView字体大小[重复]

    这个问题在这里已经有答案了 您好 我想在表视图列内的文本上设置字体 我如何用 Java 做到这一点 这是我的代码 感谢帮助 private final TableView
  • 在 Hibernate 的 XML 配置文件中指定默认值

    我通过映射配置文件配置 Hibernate
  • 为什么我无法使用 HttpUrlConnection 上传第一个文件块?

    在我的项目中 我应该从一台服务器逐块下载文件 并将每个块立即上传到另一台服务器 我有一个应该下载的文件的 URL 我们就这样称呼它吧downloadUrl 因此 这就是我逐块下载文件的方式 val chunkSize 1024 1024 B
  • Spring Boot 中的服务限流能力

    有什么办法可以实现Spring中其余服务的服务限制能力 特别是Spring boot 这里的期望是 我的服务暴露于外界 目前每秒 分钟的服务调用数量没有限制 我们希望通过设置限制来控制这一点 我有一个替代选项 通过跟踪并发哈希映射或任何缓存
  • 如何让 Camel FTP 按需只获取一次

    我对骆驼还很陌生 我一直在尝试让 Camel 根据需要仅通过 FTP 获取单个文件一次 我无法让它发挥作用 这是我尝试过的 让我知道什么是最好的方法以及我的代码有什么问题 1 读取文件后发送一条空消息当收到空消息时 停止路由 from di
  • 如何预先填充 JFileChooser 将“文件名”?

    我打算用数据库中的名称填充 JFileChooser 但使用标准 JFileChooser 对话框进行加载 删除 保存和另存为 我想给用户留下这样的印象 他们正在处理文件系统 而在后端使用数据库来保存更改 用户不应该能够浏览到不同的目录进行
  • Java无损保存原始JPEG

    如下所示 我有第一张图像是原始 JPEG 图像 第二张图像用于缓冲图像 然后使用保存http www lac inpe br JIPCookbook 6040 howto compressimages jsp http www lac in
  • 当框架被拖动时,如何设置 JWindow 的位置位于文本字段下方?

    我正在制作一个自动完成项目 就像谷歌一样 我的框架中有一个 jtextfield 每当我在该字段中输入内容时 该文本字段下方就会出现一个 JWindow 并且该窗口来自另一个类 现在的问题是 每当我拖动框架时 如何使窗口始终出现在文本字段下

随机推荐

  • 如何将焦点设置为 JScrollPane 内 JTable 中的第一行

    我有一个JTable里面一个JScrollPane 我已将其放入面板中 面板加载后 我希望 JTable 中的第一行获得焦点 但默认情况下焦点会转到JScrollPane按下 Tab 键 焦点进入表格第一行 我不想使用setRowSelec
  • ThreeJS 阴影未渲染

    我浏览过其他一些 S O 问题 遵循了所有建议 但我仍然不知道为什么我无法在这个非常基本的场景上渲染阴影 http jsfiddle net 4Txgp 更新 代码 var SCREEN WIDTH window innerWidth 25
  • 下载闪亮的 rpivotTable 输出

    我发现了一个有趣的包rpivotTable 我想创建shiny app包括rpivotTable可以使用下载生成的数据downloadHandler 但是 我无法找到解决方案 如何创建data frame或者我可以传递给的其他东西downl
  • 如何使这个 eav 查询产生水平结果

    案子 tables product product id name 1 iphone 4 2 gallaxy 2 3 blackbery 6 product attribute id product id attribute id 1 1
  • 如何使用 JAXB 解组重复的嵌套类?

    我如何指示 JAXB 处理这个问题 XML
  • Python向dbf写入数据时出错

    我得到这个错误 DbfError unable to modify fields individually except in with or Process 如何修复它 这是我的code with dbf Table aa dbf as
  • 从网页向 chrome 扩展程序发送消息

    我想从随机网页的控制台发送消息到我的 chrome 扩展程序 chrome extension sendMessage 似乎不起作用 根据官方文档你应该使用postMessage在发送者和message接收器中的事件监听器 这是一个例子 您
  • 如何通过 Runge-Kutta 4 传递硬编码微分方程

    我正在尝试实施 Runge Kutta 来解决示例问题 C 中的 dy dt y t 2 1 和 dy dt t y t 3 我似乎无法获得我期望的输出 我已将我的程序分成几个类 以尝试单独查看工作 我认为我的主要错误来自尝试使用委托将方法
  • Google 应用程序引擎 Node.js TLS 1.2

    我们的应用程序托管在 Google App Engine Node js 灵活环境 上 我们目前正在接受安全检查 但未能解决 Google App Engine 支持 TLS 1 0 和 1 1 版本的问题 有没有办法强制只使用 TLS 1
  • 在react router中显示路由之间的简单加载指示器

    我来自AngularJS世界并在几天前开始编写我的第一个 React 应用程序react router in AngularJS I do app directive Loading function rootScope timeout r
  • 如何从字符串中获取浮点值

    我有一个像这样的字符串 gt 12 4N m kg 我需要从上面的字符串中获取一个值12 4 当我使用替换所有功能时str replaceAll 0 9 当字符串有两个点时 这不起作用 浮点值的位置可能不同 首先丢弃所有非浮点字符 然后转换
  • 由于@font-face,jQuery 计算出了错误的高度

    我对 jQuery 和 font face 有疑问 我需要计算出 a 的高度 div 效果很好 但是字体加载时会有一点延迟 一旦加载 font face 字体实际上就比后备字体大 因此高度比应有的要小 我尝试过使用 Modernizr 但这
  • 如何在 JavaConfig 中定义 http“security = 'none'?

    我想使用 Java Config 在 Spring Boot 中定义类似于此 XML 的内容
  • 水晶报告图像被压扁

    Crystal Reports v11 如果这很重要 中是否有任何方法可以防止图像自行拉伸以适合整个 OLE 对象 我正在从数据库动态加载图像 但不知道它们的长宽比 感谢帮助 我找到了答案here 要使图像正确调整大小 必须按顺序执行以下步
  • Elasticsearch 超时 true 但仍然得到结果

    我将搜索查询的超时设置为 10 毫秒 因此我预计 elasticsearch 搜索查询应在 10 毫秒内超时 在回应中 我确实得到了 timed out true但查询似乎没有超时 它仍然运行几百毫秒 响应示例 took 460 timed
  • 如何为每个请求执行通用代码?

    有没有可能找到类似的功能Page Load 我有 MVC 应用程序 我需要在每个页面加载或重新加载时运行一些代码 或者调用一些控制器 所有类都有一个共享函数 我尝试 Application Start 但这仅在应用程序第一次运行时执行 我搜
  • 线程阻止所有者的垃圾收集

    在我创建的库中 我有一个 DataPort 类 它实现与 NET SerialPort 类类似的功能 它与某些硬件进行通信 并且每当数据通过该硬件传入时就会引发一个事件 为了实现此行为 DataPort 启动一个线程 该线程预计具有与 Da
  • OpenCV 2.4.9 for Python,找不到棋盘(相机标定教程)

    我正在尝试根据以下内容使用 OpenCV 工具校准相机本指南 问题是这个函数findChessboardCorners在我尝试过的图像上找不到任何棋盘 我用了很多 甚至只是简单的棋盘图案 无论如何 什么也没有被发现 这是代码 几乎与上面的链
  • Windows下在adb中运行vi

    偶尔 我会想要编辑一个文件 比如我的 Android 设备上的 system build prop 或 etc hosts 我发现最简单的方法是 c gt adb shell su vi etc hosts 如果我使用 Linux 这工作得
  • 在模型类中使用 javafx.beans 属性

    在模型类中使用 JavaFX beans 属性是否正确 我想知道在模型类中使用属 性以便能够更轻松地将它们与视图组件绑定是否是一个好习惯 我并不担心这些库将来的可用性 因为我的程序将在 JRE8 或更高版本上运行 但在模型类中使用 Java