如果你对“画板”进行过调整大小的拉动,你可能发现这会短暂地出现黑模块,同时惊讶图画全部消失了。这是因为每次我们拖动时,我们的整个可视化部分进行刷新,由paint方法重新绘制。
那么我们该如何保存那些图画呢?可以利用paint函数重绘。
之前我们了解过paint函数绘图的方法,于是现在思路很清晰了。
我们需要把图画的信息全部存起来,凭借这些信息,然后再利用Graphics g的工具包来进行重绘。
考虑到直线这类图形,全部一笔绘制而成,比之多边形一类所需信息少,故我们可以分开来设计。
现在开始了:
直线类:
1.保存信息:
思考一下一笔画图形,有什么信息呢?名称,颜色,两点坐标。
我们可以通过创建一个类,来保存这些信息。
public class picture {
int x1,y1,x2,y2;
String picname;
Color color;
}
我们可以引入构造方法(在对应类中写),及方法名与类名一致,但没有返回值,这往往用于初始化。
public Picture(String picname,Color color,int x1,int y1,int x2,int y2){
this.x1=x1;
this.y1=y1;
this.x2=x2;
this.y2=y2;
this.picname=picname;
this.color=color;
}
但是这仅仅是一个图形的信息,我们可以在监听器类中建立一个数组来储存多个图形信息。
picture[] pics=new picture[100];
int picindex=0;
2.传入信息:
我们需要明白一般要将所有信息同步传入,否则分步传入可能会让部分信息指向空,不仅会报错。之后也不能得到所需的信息。
什么时候我们可以得到一笔画图形的所有信息呢?就在鼠标释放(mouseReleased)的时候,此时一笔画图形的信息全部具备。
但是值得注意的是,我们需要建立个对象来得到所需信息,再将这赋值给我们的数组。
一是可以很好处理数组下标问题,二是使代码段更清晰。
然后传入:
Picture pic=new Picture(com,color,x1,y1,x2,y2);
pics[picindex++]=pic;
3.设计绘制方法:
这个我们可以写在picture类中,先判断名称,再来绘制。这个之前早已讲过,值得注意的是在paint函数里,我们用for循环将图画一个个画出
多边形类:
1.保存信息:
我们可以把多边形、三角形,理解为一条条直线的叠加,故所需信息也差不多。
因此我们用到了继承:(既有属性,也有方法)
public class Picturehd extends Picture{
Picturehd(String picname,Color color,int x1,int y1,int x2,int y2) {
super(picname, color, x1, y1, x2, y2);
}
然后同样在监听器类中建立一个数组,储存信息。
2.传入信息:
我们也要注意一次性传入,以及先创立对象,再用对象赋值给数组的方法。
我们可以在多边形类图像每次画直线时,同步传入。
例如:(三角形第一条线):
x4=e.getX();
y4=e.getY();
g.drawLine(x3,y3,x4,y4);
Picturehd pichd=new Picturehd(com,color,x3,y3,x4,y4);
picshd[pichdindex++]=pichd;
3.设计绘制方法:
这个比直线类更简单,因为我们只需要绘制直线,甚至不用进行分类。其他都与直线类一致!
最后,我们已经完成了图像绘制了,至于铅笔画与之同理!