重绘
引言:我们上次做的画图板中,可以注意到一旦将画图板界面最小化或者调整它的大小,
画了的那些图形就不见了。这是因为,当进行这些操作之后,其实有一个paint方法会重新把这个画图板界面画出 来,
而我们在画图板上画过的那些东西是没有被保存的。这时候我们就需要把画的这些图形的数据保存。
问题来了,该如何保存呢?我们可以把画的那个图形,包括所有的数据(名字、起止点坐标还有颜色)全部都存到一个数组里。
可以新创建一个Shape类,
代码如下:
package drawFrame; import java.awt.Graphics; import javax.swing.JButton; import java.awt.Color; public class Shape { public int x1,y1,x2,y2; String name; Color color; public int m,n; public Shape(int xa,int ya,int xb,int yb,String n,Color co){ x1 = xa;y1 = ya; x2 = xb;y2 = yb; name = n;color = co; } public void drawShape(Graphics g){ m = x1 < x2 ? x1 : x2; n = y1 < y2 ? y1 : y2; switch(name){ case "直线": g.setColor(color); g.drawLine(x1, y1, x2, y2); break; case "圆": g.setColor(color); g.drawOval(m, n, Math.abs(x2 - x1), Math.abs(y2 - y1)); break; case "矩形": g.setColor(color); g.drawRect(m, n, Math.abs(x2 - x1), Math.abs(y2 - y1)); break; } } }
在Shape这个类里面,定义x1,y1,x2,y2(起止点坐标),name(名字),color(颜色),m,n(最小值)这些变量。 然后是构造方法。注意构造方法的格式是public+方法名(参数){方法体},注意这里方法名只能与类同名!当然里面的参数只要用的变量不同就可以了。
方法体里面是赋值操作,也就是初始化。 然后是自己定义一个drawShape方法,括号里面是参数(画笔) 然后是m和n判断最小值(这里是画矩形要用到的),注意这里的判断只能在方法里面进行,不能在类那个地方进行。 然后这里用了一个switch语句,看看我点击的那个是什么(就是说我选择画的是直线、圆还是矩形)。然后,一定要在把对应的图形画出来之前设置颜色,否则没用。就是要先g.setColor(color); 以上是drawShape的代码。
当然,我们上面所有的这些操作都是要在数组里面进行的,所以最最最前提的是我们要先弄一个数组出来存这些数据。可以在DrawMouse里面新建一个shape数组,数组长度这里可以定义得长一点,就选择1000.然后要设置一下下标,就设置index,初始化值为0.代码如下:
Shape arr[] = new Shape[1000]; int index = 0;
___________________________________________________________________________________(我是分割线)
if (ab.equals("直线")) { gr.drawLine(x1, y1, x2, y2); Shape shape = new Shape(x1,y1,x2,y2,ab,color); arr[index++] = shape; } else if (ab.equals("圆")) { m = x1 < x2 ? x1 : x2; n = y1 < y2 ? y1 : y2; gr.drawOval(m, n, Math.abs(x2 - x1), Math.abs(y2 - y1)); Shape shape = new Shape(x1,y1,x2,y2,ab,color); arr[index++] = shape; } else if (ab.equals("矩形")) { p = x1 < x2 ? x1 : x2; q = y1 < y2 ? y1 : y2; gr.drawRect(p, q, Math.abs(x2 - x1), Math.abs(y2 - y1)); Shape shape = new Shape(x1,y1,x2,y2,ab,color); arr[index++] = shape; }
这里,我们同样需要重建一个shape对象,然后后面那个Shape里面就是所有的数据,接着把这个shape存到arr数组里面。同时,数组的下标必须要时刻更新,怎么更新?可以就是上面那样写,存到数组里后,就让index加加一下。其次,Shape参数里面的ab,color参数,都要定义成全局变量,在最开始时定义就OK了。 接下来,还不行。我们需要再新建一个MyFrame类,在MyFrame类里,继承我的JFrame.代码如下:
package drawFrame; import java.awt.Graphics; import javax.swing.JFrame; public class MyFrame extends JFrame{ //extends这里是继承的意思,这里用了extends,在DrawFrame的showUI里就可以把JFrame改成MyFrame了 Shape array[] = null; public void paint(Graphics g){ super.paint(g); for(int i = 0;i < array.length;i++){ //array.length表示这个数组的长度 Shape shape = array[i]; if(shape != null){ shape.drawShape(g); } } } }
先把array这个数组定义成空的,然后在paint这个方法里,把array数组的数据,存进shape里,但是也要注意,只有当shape数组不为空的时候,shape才调用drawShape方法。
但如何把这两者联系起来?在DrawFrame里面:
DrawMouse mouse = new DrawMouse(); jf.array = mouse.arr;
这样就可以了。

浙公网安备 33010602011771号