现在的位置: 首页 > 综合 > 正文

简易画图板的再次优化

2013年01月13日 ⁄ 综合 ⁄ 共 1038字 ⁄ 字号 评论关闭

前面我们实现了画板的一些功能,但是有没有注意到,每次窗口的改变,你绘制的图形就会不见了。

1、首先分析一下,为什么窗口一改变,绘制的图形就没了。这是因为窗体一旦发生改变,就会调用paint方法。

而paint方法,是系统自己有的,一般系统自己有的方法,都没有具体的实现,里面的内容为空,所以,一旦调用paint方法的时候,里面的内容为空,所以你开始绘制的图形都没了。要解决此问题,我们只需要重写paint方法就可以,首先看你的图形是在什么地方绘制的,是JFrame窗口还是JPanel里面。在什么里面绘图,paint方法就写在什么里面。

2、接下来就是paint方法里面的内容了

a.里面必须要利用super来调用父类的方法,这是因为默认的画板是由父类的画的,你重写的画板必须保持原来的状态。

super.paint(g);

b.重新绘制图形,首先是要保存,当绘制图形的时候我们利用坐标来绘制的。所以首先会想到可以通过数组来保存坐标,但是这样的话,数组的长度的定义会是一个问题。当数组长度为100时,它只能保存25条直线的坐标。所以要想另外的办法,我们可以定义一个图形数组,直接保存图形,也许长度问题还是没有解决,这样我们可以定义一个图形的自定义队列用来保存图形。

队列其实就是利用两个数组来实现的,先定义一个数组src,再定义一个比这长一个单位的数组dest。先把之前的数组src拷贝到新的数组dest中,再长一点的数组末尾加入形状。然后在交换两个数组src和dest,这样就形成了一个队列。主要代码如下:

Shape[] src = new Shape[0];

/**
* 添加元素方法
*/
public void add(Shape shape) {
//创建新数组
Shape[] dest = new Shape[src.length+1];
//拷贝
for(int i=0;i<src.length;i++){
dest[i] = src[i];
}
dest[src.length] = shape;
//交换
src = dest;
}

c.上面实现了图形的保存,但当使用的时候还需要一些其他的功能,比如队列的长度,指定位置的元素。这些功能都比较简单,就不再次贴代码了。

d.然后再重绘paint方法中得到数组,最后利用for循环,把之前绘制所有的图形都重新再绘制一遍,这样再去改变窗体时,调用的就是重新写的paint方法。绘制的图形就不会因为窗体的改变而消失。

注意:paint不能写成其他名字,要不然重绘功能还是不会实现,一定要写成paint


抱歉!评论已关闭.