重绘

 引言:我们上次做的画图板中,可以注意到一旦将画图板界面最小化或者调整它的大小,

画了的那些图形就不见了。这是因为,当进行这些操作之后,其实有一个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;

这样就可以了。

posted @ 2020-12-27 17:33  EvanTheBoy  阅读(167)  评论(0)    收藏  举报