关于画图的保存

来源:互联网 发布:java单机游戏下载网站 编辑:程序博客网 时间:2024/05/21 08:09

之前有写过一个画图板的小程序,不能保存,这次添加了一个保存功能,效果大致如下:
这里写图片描述

关于如何保存,保存数据,就是要保存作画时的每个动作,一条简单的画直线的操作要如何保存呢?有四个要素:保存要画的是直线,画笔的颜色,起始坐标,终止坐标。保存好这四个要素,就可以把之前的画过的直线重新画一遍。

我们可以定义一个Shape类来定义画图时的每一个动作,这样将数据写入到磁盘中保存、每次打开程序并从磁盘中读取文件时,就要用到数据流。


具体怎么做?

1、在程序中定义一个Shape类的队列
private ArrayList<Shape> list = new ArrayList<Shape>();
(注意: 要给它分配空间,= new 不能少 ,否则写不进去内容)

2、在程序启动的时候,就要list的内容初始化,也就是从磁盘中将存储的shape一个个读出来,并添加到list中去。

3、然后就是记录新添加的笔画,如果画笔有新的动作就立即添加到list中去。如果按保存按钮,就将list的内容再写入到磁盘中去(覆盖原有内容)。


在写程序的时候也遇到了一些问题,在这里就一一说一下:

1、开始想每添加一个画图的操作就立即存储到磁盘中去,这样比较麻烦,而且使用着没有要求保存(按保存按钮),就保存了,不符合要求。

2、在拖动和松开这两个Actionlistener的方法中重复定义了画直线的操作。

3、写入和读取没有严格的一一对应,导致读出来有问题。(写的时候用write、读的时候用的readInt,显然不可以,读出来的就不一致)。

4、Color类怎么保存,Color可以转换成rgb的值 ,也就是 int rgb = color.getRGB(); 但是不知道怎么把rgb 转换成 Color类(有上网查rgb, rgb为int型,占四个字节,前三个字节分别为red、green 、blue的值,最后一个字节为颜色的透明度),所以干脆将颜色分为red、green、blue这三个值存储,然后复原颜色的时候就用
Color color = new Color(red,green,blue) ;

5、之前的图像类型是用String保存的,比如说记录画直线,它保存的对象就是”line”,但是如果将String转换成byte数组保存在磁盘中不好读取(因为不知道有多大),所以用int型代替String类型的数据,比如“line”,我就用1标记它,存入图像类型的时候存储1,读出来的时候如果读到的是1,我就知道该画直线了。

6、对于一些特殊的操作有不同的方法:
对于喷漆(spout),只对一个xy坐标进行操作,所以起始坐标和终止坐标一样。
对于多边形则将其拆分成多个直线保存就可以了。
对于刷子,要注意设置画笔的宽度,画完了之后还要讲宽度复原为1。
对于橡皮擦,其颜色始终为白色,它就相当于一个白色刷子。

7、比较重要的一点,要注意画笔的获取要在窗体可见之后!!!

8、当我码完所有代码,满怀欣喜的想验证自己的保存成果时,居然发现不能成功保存,呈现给我的仍然是一张白纸,为什么要这样对我…有问题只因为自己的代码有问题,问题出在哪里呢?
我的代码原来是这样的:

        this.setVisible(true);        Graphics g = centerPanel.getGraphics();        dl.setG(g);        dl.DrawInit();

窗体可见之后就执行DrawInit(),但是我们要知道画窗体的速度要比我们执行DrawInit()的速度要慢,所以窗体讲我们的画作覆盖掉了。
只要在窗体可见之后加一段时延就可以了。修改后的代码如下:

        this.setVisible(true);        try {            Thread.sleep(1000);        } catch (InterruptedException e) {            // TODO 自动生成的 catch 块            e.printStackTrace();        }        Graphics g = centerPanel.getGraphics();        dl.setG(g);        dl.DrawInit();

最后提出一个问题:
int rgb = color.getRGB();
这个rgb怎么转成color 。

0 0
原创粉丝点击