【问题标题】:Serializing Canvas objects in Java在 Java 中序列化 Canvas 对象
【发布时间】:2015-12-06 09:24:03
【问题描述】:

我正在尝试序列化一个Canvas 实例(使用Serializable 接口),我在该实例上绘制了一些像素,如下代码所示:

Canvas board = new Canvas();
Graphics g = board.getGraphics();
g.setColor(Color.BLACK);
g.drawString("txt", 10, 20);
g.dispose();

然后,当我序列化 board 时,它不会保存我绘制的像素。我猜这是因为通过使用getGraphics() 我没有将这些像素保存到任何实例中,所以我想也许我应该从Canvaspaint() 方法中进行绘制。序列化Canvas 然后也保存修改后的像素吗?如果没有,我有什么选项可以使用我修改过的像素来保存/序列化Canvas?我猜我必须序列化Graphics 对象而不是Canvas?我是 Java 图形的新手,任何帮助将不胜感激。

更清楚地说,我要做的是使用序列化将我放在Canvas 实例上的像素保存到文件中。然后稍后我需要从我之前保存的序列化文件中重新加载这个Canvas 实例,这样当我在屏幕上使用它时,我会看到我在序列化Canvas 之前修改的完全相同的像素。我知道如何序列化对象等等。我只是不清楚所有像素都存储在哪里。

更新1:

用户在屏幕上绘制内容的方式是左键单击Canvas 区域。然后MouseListener 调用下面的方法,传递Point 指定鼠标xy 的对象:

private void drawAt(Point p)
{
    Graphics g = board.getGraphics();
    g.setColor(brushColor);
    g.setFont(brushFont);
    g.drawString(brushText, p.x, p.y);
    g.dispose();
}

【问题讨论】:

    标签: java canvas serialization


    【解决方案1】:

    不要序列化 ​​Canvas 或任何其他 GUI 组件,因为您将序列化程序的“视图”部分,这是一件有风险的事情(由于尝试序列化和反序列化不可序列化的子组件而导致序列化异常的高风险)还有一件低效的事情——序列化大量由 JVM 自动构建的数据,因此不需要序列化。

    相反,您需要序列化数据的“模型”部分,即保存程序逻辑数据的部分。因此,如果您的 GUI 是使用 ArrayList 保存的数据、ArrayList 的集合或所需的任何数据绘制的,那么请序列化该数据。然后确保创建您的 GUI,以便可以使用序列化数据进行构建。

    或者,如果您需要存储图像,则存储图像,最好是无损 png 文件。

    另外,我建议您绘制一个 BufferedImage,然后在 JPanel 的 paintComponent 方法覆盖中显示该 BufferedImage,然后保存并恢复该图像。有关如何绘制和保存的更多信息,请查看这些链接。前两个是我的代码,第三个是 MadProgrammer 的:

    【讨论】:

    • 该程序基本上类似于 mspaint 或 photoshop,它允许用户在 Canvas 上绘制任何他们想要的东西,所以我不确定在这种情况下是否可以序列化模型,除非我跟踪他们用来绘制的鼠标的每个 x 和 y 坐标、颜色、画笔大小等。这就是为什么我认为只保存像素而不是用户可能采取的所有随机步骤来绘制东西会更容易。
    • @programmar:我将再次强调这一点,因为这是事实:你不想序列化 Canvas,无论如何,你不想序列化它。很大程度上取决于您如何绘制,我们还不知道,但您仍然可以从绘制的图像中提取 png 图像并保存,或者如果您希望绘制具有撤消功能的绘图,那么您可以希望保存图像或点的集合。
    • @programmar:出于好奇——您为什么使用 AWT GUI 类 Canvas?为什么不使用诸如 JPanel 或 JavaFX 组件之类的 Swing 组件?
    • 我主要使用Canvas,只是因为我们的教授限制了我们可以使用的东西。我也可以选择使用JPanel,如果这样会让事情变得更好的话。像您建议的那样,我必须研究哪些类才能将绘制的图像提取为 png?
    • @programmar:请更新您的问题并向我们展示您的绘画方式。希望您没有在组件上调用 getGraphics()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2012-03-17
    • 1970-01-01
    相关资源
    最近更新 更多