繁体   English   中英

用Java序列化Canvas对象

[英]Serializing Canvas objects in Java

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

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

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

更清楚地说,我要尝试的是使用序列化将我在Canvas实例上放置的像素保存到文件中。 然后,稍后我需要从之前保存的序列化文件中重新加载此Canvas实例,以便在屏幕上使用它时,可以看到在序列化Canvas之前完全修改过的像素。 我知道如何序列化对象等等。 我只是不清楚所有像素存储在哪里。

UPDATE1:

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

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

不要序列化Canvas或任何其他GUI组件,因为要序列化程序的“视图”部分,这是一件危险的事情(由于尝试序列化和反序列化不可序列化的子组件而导致序列化异常的高风险)并且效率低下要做的事情-序列化由JVM自动生成的大量数据,因此不需要序列化。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM