我正在尝试序列化一个Canvas
实例(使用Serializable
接口),我在其上绘制了一些像素,如下面的代码所示:
Canvas board = new Canvas();
Graphics g = board.getGraphics();
g.setColor(Color.BLACK);
g.drawString("txt", 10, 20);
g.dispose();
然后当我序列化board
时,它不会保存我画过的像素。我猜这是因为使用getGraphics()
我没有将这些像素保存到任何实例,所以我想也许我应该在Canvas
的{{1}}方法中进行绘制。序列化paint()
然后还保存修改后的像素吗?如果没有,我可以选择使用我修改过的像素保存/序列化Canvas
吗?我猜我必须序列化Canvas
对象而不是Graphics
?我是Java图形的新手,非常感谢任何帮助。
更清楚的是,我要做的是将我放在Canvas
实例上的像素使用序列化保存到文件中。然后我需要从我之前保存的序列化文件中重新加载这个Canvas
实例,这样当我在屏幕上使用它时,我会看到在序列化Canvas
之前修改过的完全相同的像素。我知道如何序列化对象和所有这些。我不清楚所有像素的存储位置。
UPDATE1:
用户在屏幕上绘制内容的方式是左键单击Canvas
区域。然后Canvas
调用以下方法,传递指定鼠标xy的MouseListener
对象:
Point
答案 0 :(得分:2)
不要序列化Canvas或任何其他GUI组件,因为您要序列化程序的“View”部分,这是一件冒险的事情(由于尝试序列化和反序列化不可序列化的子组件而导致序列化异常的高风险)并且效率低下 - 序列化由JVM自动构建的大量数据,因此不需要序列化。
相反,您需要序列化数据的“模型”部分,该部分包含程序的逻辑数据。因此,如果使用ArrayList保存的数据或ArrayLists集合或其所需的任何数据绘制GUI,则序列化该数据。然后一定要创建GUI,以便可以使用序列化数据构建。
或者,如果您需要存储图像,则存储图像,最好是作为无损png文件。
另外,我建议你绘制一个BufferedImage,然后在JPanel的paintComponent
方法覆盖中显示BufferedImage,然后保存并恢复图像。有关如何绘制和保存的更多信息,请查看这些链接。前两个包含我的代码,第三个是MadProgrammer的代码: