Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中序列化画布对象_Java_Canvas_Serialization - Fatal编程技术网

在Java中序列化画布对象

在Java中序列化画布对象,java,canvas,serialization,Java,Canvas,Serialization,我正在尝试序列化一个Canvas实例(使用Serializable界面),我在该实例上绘制了一些像素,如以下代码所示: Canvas board = new Canvas(); Graphics g = board.getGraphics(); g.setColor(Color.BLACK); g.drawString("txt", 10, 20); g.dispose(); 然后,当我序列化board时,它不会保存我绘制的像素。我猜这是因为通过使用getGraphics()我没有将这些像素保

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

Canvas board = new Canvas();
Graphics g = board.getGraphics();
g.setColor(Color.BLACK);
g.drawString("txt", 10, 20);
g.dispose();
然后,当我序列化
board
时,它不会保存我绘制的像素。我猜这是因为通过使用
getGraphics()
我没有将这些像素保存到任何实例中,所以我认为也许我应该从
Canvas
paint()方法中进行绘制。序列化
画布
是否也会保存修改后的像素?如果没有,我可以选择哪些选项来保存/序列化已修改像素的
Canvas
?我猜我必须序列化
图形
对象,而不是
画布
?我是Java图形新手,任何帮助都将不胜感激

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

更新1:

用户在屏幕上绘制内容的方式是左键单击
画布
区域。然后,
MouseListener
调用以下方法,沿着指定鼠标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();
}

不要像序列化程序的“视图”部分那样序列化画布或任何其他GUI组件,这是一件危险的事情(由于尝试序列化和取消序列化不可序列化的子组件,因此序列化异常的风险很高)还有一件效率低下的事情——序列化JVM自动生成的大量数据,因此不需要序列化

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

或者,如果您需要存储一个图像,那么存储一个图像,最好是作为一个无丢失的png文件

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

  • ,

该程序基本上类似于mspaint或photoshop,它允许用户在
画布上绘制任何他们想要的内容,因此我不确定在这种情况下是否可以序列化模型,除非我跟踪他们用于绘制的鼠标的每个x和y坐标、颜色、笔刷大小,等等。这就是为什么我认为只保存像素比保存用户绘制东西所需的所有随机步骤更容易。@programmar:我将再次强调这一点,因为这是事实:您不想序列化画布,不管发生什么,您都不想序列化它。这在很大程度上取决于您如何绘制图形,我们目前还不知道这一点,但您仍然可以从绘制的图像中提取png图像并保存它,或者如果您希望有一个具有撤消功能的图形,那么您可能希望保存图像或点的集合。@programmar:出于好奇--为什么要使用AWT GUI类Canvas?为什么不使用像JPanel或JavaFX这样的Swing组件呢?我主要使用
Canvas
,因为我们的教授限制了我们可以使用什么。我也可以选择使用
JPanel
,如果这能让事情变得更好的话。要像您建议的那样将绘制的图像提取为png,我需要研究哪些类?@programmar:请更新您的问题,并向我们展示您是如何绘制的。希望您不是在组件上调用
getGraphics()