javafx 和可序列化

2024-01-03

在旧的 AWT 库中,Point类和Color类是可序列化的。 JavaFX 中都没有。我想保存一个数组列表Drawable到一个文件;这是界面

import javafx.scene.canvas.GraphicsContext;

public interface Drawable
{
    public void draw(GraphicsContext g);
}

当我尝试这样做时,我遭到轰炸NotSerializableExceptons。 最好的替代行动方案是什么?我所有的绘图都知道它们的颜色和大小。


使用自定义可序列化表单并序列化您需要的数据。例如。

import javafx.scene.canvas.GraphicsContext ;
import javafx.scene.paint.Color ;
import javafx.geometry.Rectangle2D;
import java.io.Serializable ;
import java.io.ObjectInputStream ;
import java.io.ObjectOutputStream ;
import java.io.IOException ;

public class DrawableRect implements Drawable, Serializable {

    private transient Color color ;
    private transient Rectangle2D bounds ;

    public DrawableRect(Color color, Rectangle2D bounds) {
        this.color = color ;
        this.bounds = bounds ;
    }

    @Override
    public void draw(GraphicsContext g) {
        g.setFill(color);
        g.fillRect(bounds.getMinX(), bounds.getMinY(), bounds.getWidth(), bounds.getHeight());
    }

    private void writeObject(ObjectOutputStream s) throws IOException {
        s.defaultWriteObject();
        // write color:
        s.writeDouble(color.getRed());
        s.writeDouble(color.getGreen());
        s.writeDouble(color.getBlue());
        s.writeDouble(color.getOpacity());

        // write bounds:
        s.writeDouble(bounds.getMinX());
        s.writeDouble(bounds.getMinY());
        s.writeDouble(bounds.getWidth());
        s.writeDouble(bounds.getHeight());
    }

    private void readObject(ObjectInputStream s)
            throws IOException, ClassNotFoundException {
        s.defaultReadObject();
        double r = s.readDouble();
        double g = s.readDouble();
        double b = s.readDouble();
        double opacity = s.readDouble();

        color = new Color(r,g,b,opacity);

        double x = s.readDouble();
        double y = s.readDouble();
        double w = s.readDouble();
        double h = s.readDouble();

        bounds = new Rectangle2D(x,y,w,h);
    }
}

如果您有可序列化的字段(或原始类型),则无需标记它们transient,以及defaultReadObject and defaultWriteObject会处理他们的。如果您有不可序列化的字段,请标记它们transient并将数据序列化为可序列化的形式,如示例所示。

显然,由于您有此接口的多个实现,这些实现可能都需要此功能,因此使用一些静态方法创建一个辅助类可能会对您有利:

public class DrawableIO {

    public static void writeColor(Color color, ObjectOutputStream s) throws IOException {
        s.writeDouble(color.getRed());
        s.writeDouble(color.getGreen());
        s.writeDouble(color.getBlue());
        s.writeDouble(color.getOpacity());
    }

    public static Color readColor(ObectInputStream s) throws IOException {
        double r = s.readDouble();
        double g = s.readDouble();
        double b = s.readDouble();
        double opacity = s.readDouble();

        return new Color(r,g,b,opacity);
    }

    public static void writeBounds(Rectangle2D bounds, ObjectOutputStream s) throws IOException {
        s.writeDouble(bounds.getMinX());
        s.writeDouble(bounds.getMinY());
        s.writeDouble(bounds.getWidth());
        s.writeDouble(bounds.getHeight());
    }

    public static Rectangle2D readBounds(ObjectInputStream s)  throws IOException {
        double x = s.readDouble();
        double y = s.readDouble();
        double w = s.readDouble();
        double h = s.readDouble();

        return new Rectangle2D(x,y,w,h);
    }
}

然后当然是你的方法Drawable实现减少到类似

private void writeObject(ObjectOutputStream s) throws IOException {
    s.defaultWriteObject();
    DrawableIO.writeColor(color, s);
    DrawableIO.writeBounds(bounds, s);
}

private void readObject(ObjectInputStream s)
        throws IOException, ClassNotFoundException {
    s.defaultReadObject();

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

javafx 和可序列化 的相关文章

  • 将 stdout 作为命令行 util 的文件名传递?

    我正在使用一个命令行实用程序 该实用程序需要传递文件名以将输出写入 例如 foo o output txt 它唯一写入的东西stdout是一条消息 表明它运行成功 我希望能够通过管道传输写入的所有内容output txt到另一个命令行实用程
  • PyQt - 如何检查 QDialog 是否可见?

    我有个问题 我有这个代码 balls Ball for i in range 1 10 因此 当我说 Ball 时 这将在 QDialog 上绘制一个球 然后当这完成后 我正在移动球QDialog无限循环中 我想说类似的话while QDi
  • 从 Java 应用程序读取的文件是否会调用系统调用?

    我的理解是 请求文件系统路径 例如 aFile 的用户应用程序将调用文件系统并获取所请求文件的虚拟地址 然后应用程序将尝试以该地址作为参数 即作为 CPU 指令 进行读 写操作 执行读取命令时 内存管理单元会将该地址转换为物理地址 并查看页
  • 预乘 Alpha 合成

    我正在尝试实现预乘阿尔法混合 在本页 什么是颜色混合 https learn microsoft com en us previous versions windows xna bb976070 v xnagamestudio 41 它们确
  • 在 JavaFX 中搜索 TableView 列表

    如何在 TableWie 中查找记录 例如通过 ID 并选择创建的行并将其放在 Java 8 JavaFX 中的屏幕中间 您可以使用以下方式搜索元素 int searchId table getItems stream filter ite
  • 为什么文件更新时“如果较新则复制”不复制文件?

    我在 Visual Studio Express 中有一个解决方案 如下所示 The LogicSchemaC 中的类 将在运行时解析指定的 XML 文件 以下是在main的方法Program cs LogicSchema ls new L
  • JavaFX 中 WebView 的性能

    我有一个 HTML5 UI 和一个 Java 后端 并且希望避免在纯 java 中重建 HTML ui 所以我的想法是运行本地 Web 服务器并使用 WebView 在 本机 窗口中呈现它 解决方案似乎是使用可以嵌入到 swing 中的 J
  • Paper.js 中的事件处理程序

    我是 Paper js 的新手 在阅读教程时我对事件系统感到好奇 这就是事件处理中描述的方式tutorial http paperjs org tutorials interaction mouse tool events var path
  • 为什么 fopen 无法打开已存在的文件?

    我在 Windows XP 上使用 Visual Studio 6 是的 我知道它很旧 构建 维护 C DLL 我遇到了 fopen 无法打开现有文件的问题 它总是返回 NULL 我试过了 通过将 errno 和 doserrno 设置为零
  • 使用 FileInputStream 时如何确定理想的缓冲区大小?

    我有一个从文件创建 MessageDigest 哈希 的方法 我需要对很多文件 gt 100 000 执行此操作 用于读取文件的缓冲区应该设置多大才能最大限度地提高性能 大多数人都熟悉基本代码 为了以防万一 我将在这里重复一遍 Messag
  • 错误:缺少 JavaFX 运行时组件,并且需要使用 Gradle 示例来运行此应用程序

    我知道这个问题已被问过多次 但我似乎找不到解决方案 摘自官方指南示例 https openjfx io openjfx docs gradle https openjfx io openjfx docs gradle我继续添加了我的构建 g
  • 如何在日期选择器中设置不在当前月份的单元格的样式

    我目前正在为我的 JavaFX 应用程序制作注册表 问题是 当日期选择器中的单元格不在页面的月份上时 我想让该单元格变灰 让我们看看我当前的日期选择器 我的日期选择器 正如您所看到的 我希望下个月的日期 27 日 28 日 30 日以及 1
  • 使用 Graphics.FromHwnd 在屏幕上绘图和清除

    我正在尝试创建一个程序 它获取光标下窗口的句柄 显示有关它的一些数据 并在整个窗口的顶部绘制一个填充矩形 具有非常低的阿尔法 我正在使用 C 和 winforms 我已经成功地做到了这一点 但问题是我的绘制方法位于BackgroundWor
  • 将签名位图转换为签名字符串(很奇怪的一个)

    基本上我需要将位图图像转换为字符串 但这不是常见的 困境在于该字符串由两部分组成 1 积分 2 线路 我需要将图像转换为由 分隔的两个部分 我得到的一个例子是 221A 221A270A270A25032503200720071716171
  • 如何从 C++ 中的文件中读取双精度值

    如何从 C 中的文件中读取 double 值 对于整数 我知道您可以使用 getline 然后使用 atoi 但我没有找到双倍函数的数组 什么可用于读取双精度数或将 char 数组转换为双精度数 您可以使用流提取 std ifstream
  • ListChangeListener wasPermutated 块

    ListChangeListener 的 JavaDoc 提供了用于处理更改的模板 但是 我不知道如何处理排列 对于每个索引 我都可以找到该项目的新索引在哪里 但我不知道如何处理它 这是一个独立于编程语言的难题 ObservableList
  • [APUE]fork后父进程和子进程是否共享相同的文件偏移量?

    在 APUE 第 8 3 节中fork function 关于父子进程之间的文件共享 它说 It is important that the parent and the child share the same file offset 在
  • 为什么 JavaFX API 不包含在 Java 8 J2SE 中? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有谁知道为什么 JavaFX 8 仍然不是即将推出的 Java 8 中的日常 J2SE API 显示所有 Java 组件的技术图清楚地将 Jav
  • 监视目录的更改

    很像一个类似的问题 https stackoverflow com questions 112276 directory modification monitoring 我正在尝试监视 Linux 机器上的目录以添加新文件 并希望在这些新文
  • 时间:2019-03-17 标签:c++fstream并发访问

    如果从不同的进程 线程同时访问文件会发生什么 据我所知 没有锁定文件的标准方法 只有操作系统特定的功能 就我而言 文件将被经常读取而很少写入 现在如果A打开一个文件进行读取 ifstream 并开始读取块 和B打开相同的文件进行写入 ofs

随机推荐

  • SparkSQL 和 Java 中的 DataFrame 上的爆炸

    有没有简单的方法如何使用explodeSpark SQL 中的数组列DataFrame 在Scala中相对简单 但在Java中这个功能似乎不可用 如javadoc中提到的 一个选项是使用SQLContext sql and explode查
  • Rails Arel 通过连接表上的 where 条件进行连接

    我正在尝试将以下 Rails where 子句转换为使用 Arel 主要是为了利用orArel 提供的方法 后模型 class Post belongs to user end 用户模型 class User has many posts
  • Delphi 7 - 如何使用标题从列表视图中删除项目

    我正在尝试删除基于标题的列表视图项目 但我找不到解决方案 删除项目的唯一方法是使用索引 listview1 Items Delete 0 谁能帮我通过标题删除项目 您可以使用类似的东西 它尝试找到ListItem与标题Item 2 如果找到
  • Python:如何根据网络节点的度数为其着色?

    我有一个无标度网络10000节点 但边缘的纹理和节点的数量使其过于复杂而难以理解 我希望能够直观地找到连接程度最高的节点 我如何根据节点的 k 度对节点进行着色 具体来说 我想根据预先指定的范围为它们着色 例如 绿色如果1
  • Windows 上的 System.err 在哪里?

    我有一个基于 Java GUI 的应用程序 它将一些诊断消息写入 System out 和 System err 在 Windows 上运行时这些消息输出在哪里 例如 在 Mac OS X 上 它们被打印到系统控制台日志中 Edit 我应该
  • pyqt QtGraphicsView 未在循环内更新

    我有一个基于 PyQt 构建的 GUI 程序 GUI 有一个 QtGraphicsView 小部件 其中有一个 GraphicsScene 其中有一个要显示和更新的 Pixmap 项目 例如 我使用以下行来执行此操作 view scene
  • 使用 scanf 的返回值验证输入不起作用

    我正在做一个井字棋期末项目 我要求用户打印他想要填写的框号 然后我使用整数err来获取返回值scanf 在这种情况下 scanf 应该返回它已读取的整数数量 而我要求读取一个整数 因此只要 err 1 它就应该进入 while 循环 然而
  • C# 开发工作的项目结构 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 What directory solution project structure do you find to be the most man
  • 如何在 Vapor 3 中将字典的元素分配给 JSON 对象?

    在 Vapor 1 5 中 我曾经将现有字典的元素分配给 JSON 对象 如下所示 我该如何做这个 Vapor 3 func makeCustomJSON jsonFromReading JSON clientData DataFromCl
  • Delphi死锁解释/解决方案

    在服务器应用程序上 我们有以下内容 一个称为 JobManager 的单例类 另一个类是 Scheduler 它不断检查是否需要向 JobManager 添加任何类型的作业 当需要这样做时 调度程序会执行以下操作 TJobManager S
  • 让 Kubernetes 等待 Pod 终止,然后再从服务端点中删除

    根据Pod 的终止 https kubernetes io docs concepts workloads pods pod lifecycle pod termination 步骤 7 与 3 同时发生 有什么办法可以防止这种情况发生并且
  • R 中插入符中的并行处理

    插入符号文档中给出了允许并行处理以下代码的工作原理 library doMC registerDoMC cores 5 All subsequent models are then run in parallel 但在最新的 R 版本 3
  • jQuery 更改类名

    我想根据 td 标签的 id 更改 td 标签的类 td class change me 我希望能够在其他 dom 对象的单击事件中执行此操作 如何获取 td 的 id 并更改其类别 Using jQuery你可以set类 无论它是什么 w
  • 如何在 Spring Boot 中使用 @Lazy 延迟加载 RabbitMQ 队列?

    实际上 在我的 RabbitMQ 配置中 我为每个队列声明了 10 个消费者 因此 所有消费者线程都是在我的 Spring Boot 应用程序完全启动之前创建的 因此应用程序启动需要时间 我想在项目启动时延迟加载所有 Rabbitmq 队列
  • Python:使用泰勒级数逼近 ln(x)

    我正在尝试建立 ln 1 9 的近似值 精度在十位数字之内 即 641853861 我正在使用一个从 ln 1 x 1 x 构建的简单函数 到目前为止 这是我的代码 function for ln 1 x 1 x def taylor tw
  • 带鼠标滚轮的 D3 v4 平移

    如何使用 d3 js 版本 4 通过鼠标滚轮进行平移 我发现这个例子使用的是 v3 但它不适用于 v4 示例链接 http bl ocks org ahmohamed 82ac20ccc949470e3206
  • 如何禁用 Sun jvm 的内联优化?

    我需要做一些实验来展示内联对我的代码的影响 有人知道如何禁用 sun jvm 内联吗 我搜索了http www oracle com technetwork java javase tech vmoptions jsp 140102 htm
  • getRunningAppProcesses() 返回被销毁的进程

    我正在使用以下代码片段来检查我是否使用了应用程序finish ed 确实不再运行 ActivityManager am ActivityManager this getSystemService ACTIVITY SERVICE List
  • 即使库已链接,对符号的未定义引用

    当链接我正在处理的项目时 链接器给出以下错误 usr bin ld Includes and Libs lib libsfml21rca a SoundFile o undefined reference to symbol sf read
  • javafx 和可序列化

    在旧的 AWT 库中 Point类和Color类是可序列化的 JavaFX 中都没有 我想保存一个数组列表Drawable到一个文件 这是界面 import javafx scene canvas GraphicsContext publi