重绘的意义
你是否苦恼于在自己精心编写代码实现的画板上画出的图形,在一个不经意的拉伸窗体,或是隐藏后,画板上又只剩一片空白呢?为了解决这个问题,将图形牢牢留住,我们就需要进行重绘。
图形会消失的原因
首先我们要明白的是当我们将画板窗体移除或者改变画板窗体大小的时候都是画板的Frame框架在不断调用paint()方法。我们写的代码中有给Frame框架增加组件的部分,而这些组件包括框架就是通过paint方法将这些组件“画”到了我们的电脑屏幕上才让我们看到了这些组件。那么当我们将画板最小化、将画板拖到边缘或者改变画图板大小的时候,都是画图板的可视化部分在改变的时候。既然画图板可视部分要改变了,就必须通过重新“画”一个新画板上去实现状态的改变,这就是paint方法调用的原因。而paint方法是一个java早已定义好的方法,java设计者并不知道我们用paint方法是来画图形的,设计者在设计之初只定义了用paint方法把这些组件画出来了,却并没有画我们自己创造的这些图形的这个部分。因此当程序自动调用paint方法时,就没有实现我们之前画的图形的可视化过程,只实现了框架组件的可视化过程,这就是为什么会出现已画图形消失的原因。
重绘的构思
重绘,顾名思义,就是把已经画在画板上的图形重新画一遍。那么,我们就需要重写paint这个方法。同时,我们也需要收集已经绘制的图形的信息,方便在重绘方法中再次绘制。
综上,为实现重绘,我们需要经过以下步骤:
1.重写paint方法,以达到重绘效果
2.创建一个图形类
3.创建数组,储存已绘制的图形
4.运用paint方法绘制
重写paint方法,以达到重绘效果
super.paint(g);
for (int i=0;i< shapeArr.length;i++){
Shapes shapes=shapeArr[i];
if (shapes!=null){
shapes.drawShapes(g);
}
}
}
这里我们重新定义了一个方法paint来实现重绘。
首先,super即父类,以为保留了父类JFrame中的paint方法;
接着,我们使用for循环来遍历已经绘制的图形
创建一个图形类
public class Shapes {
public int x1,x2,x3,y1,y2,y3;
public String name;
public void drawShapes(Graphics g){
switch (name){
case "直线":
g.drawLine(x1,y1,x2,y2);
break;
case "三角形":
g.drawLine(x1,y1,x2,y2);
g.drawLine(x1,y1,x3,y3);
g.drawLine(x2,y2,x3,y3);
break;
case "矩形":
g.drawLine(x2,y1,x2,y2);
g.drawLine(x1,y2,x2,y2);
g.drawLine(x1,y1,x2,y1);
g.drawLine(x1,y1,x1,y2);
break;
}
}
}
这里我们使用switch方法对name进行筛选,根据不同的图形,绘制不一样效果。
创建数组,储存已绘制的图形
public Shapes[] shapeArr = new Shapes[100];
这里我们创建一个图形数组,用以储存已绘制的图形。(数组要足够大可以储存所有图形,这里的100可以换成1000,10000等)
x2=e.getX();
y2=e.getY();
if(flag==1){
g.drawLine(x1,y1,x2,y2);
Shapes shape = new Shapes();
shape.name = name;
shape.x1 = x1;
shape.y1 = y1;
shape.x2 = x2;
shape.y2 = y2;
shapeArr[index] = shape;
index++;
}else if (flag==2){
g.drawLine(x2,y1,x2,y2);
g.drawLine(x1,y2,x2,y2);
g.drawLine(x1,y1,x2,y1);
g.drawLine(x1,y1,x1,y2);
Shapes shape = new Shapes();
shape.name = name;
shape.x1 = x1;
shape.y1 = y1;
shape.x2 = x2;
shape.y2 = y2;
shapeArr[index] = shape;
index++;
}else if (flag==3){
x3=Math.abs(2*x1-x2);
y3=y2;
g.drawLine(x1,y1,x2,y2);
g.drawLine(x1,y1,x3,y3);
g.drawLine(x2,y2,x3,y3);
Shapes shape = new Shapes();
shape.name = name;
shape.x1 = x1;
shape.y1 = y1;
shape.x2 = x2;
shape.y2 = y2;
shape.x3 = x3;
shape.y3 = y3;
shapeArr[index] = shape;
index++;
}
}
这里我们在鼠标监听器中,每次绘图后,即将图像的x1,x2,x3,y1,y2,y3,name等信息存入数组中。
运用paint方法绘制
jf.shapeArr=ml3.shapeArr;
最后,我们再将数组从图形类传递至窗体,即可用paint方法完成重绘功能了。