在我们的第一个简易画图板中,使用了两个类DrawFrame和DrawListener,但是有一个很大的问题,不能保存!当我们扩大或缩小画图板的大小时,之前的一起都没了。
原因在于,当我们改变画图板的时候,其实是将他重新画了一遍,而不是改变原来的大小,所以原来的自然就被重画的窗体给覆盖了,所以我们也需要重画一遍之前画的

而要重画之前画的,比如我们画了两条直线,要想把两条直线重画出来,需要先保存他们的先后顺序,画了两条,所以需要一个数组sharr[]
同时要保存关于他们的信息,直线的话为
起点坐标,末点坐标,粗细,颜色,名字,粗细和颜色暂不考虑

而直线也好,矩形也好,都是图形,所以我们需要用一个shape方法来保存
里面的参数包括(x1,y1,x2,y2,name)
所以我们需要构造一个shape类,包含shape方法,直线的一切信息作为他的私有属性

做了这些之后我们就可以使用paint方法了,这个方法是在窗体类中写的,现在我们是有三个类,一个窗体类,一个***,一个shape类
paint方法是JFrame中的方法,所以我们的窗体类还要继承JFrame方法
一开始就要调用super.paint(),表示继承父类中的方法
然后使用for循环,将sharr里面的保存的图像一个一个的画出来,这里可以直接复制***中的方法,但是太麻烦了,所以我们可以把画图的方法都移到shape类中,在***和窗体中分别调用,

综上:
**shape作用:创建图形对象,实现画图的具体方法
***作用:调用画图方法,实时绘制要画的图像,每画一次就保存一次图像信息在数组中,包括坐标,颜色等
窗体类作用:显示窗体,将数组中的图像信息重新画出来,调用画图方法**

在***和窗体类中都有数组,但是我们知道画布是从窗体传过去的,所以默认一切变量都从窗体传到***


shape类
package com.panel;

import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;

public class MyShape {
    private int x1;
    private int y1;
    private int x2;
    private int y2;
    private String name;


    public void shape(int x1,int y1,int x2,int y2,String name) {
        this.x1=x1;
        this.y1=y1;
        this.x2=x2;
        this.y2=y2;
        this.name=name;
    }
    public void draw(Graphics g) {//画图方法
        g.drawLine(x1, y1, x2, y2);

    }
}

***类

package com.panel;

import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class eListener implements MouseListener,ActionListener{
    private int x1,x2,y1,y2;
    String shapeType="";
    Graphics g;
    MyShape [] sharr;
    int count=0;

    public void setG(Graphics g) {//传画布
        this.g=g;
    }
    public void setarr(MyShape [] arr) {//传数组
        sharr=arr;
    }
    @Override
    public void mouseClicked(MouseEvent e) {
        // TODO Auto-generated method stub

    }
    @Override
    public void mousePressed(MouseEvent e) {
        // TODO Auto-generated method stub
        x1=e.getX();
        y1=e.getY();
    }
    @Override
    public void mouseReleased(MouseEvent e) {
        // TODO Auto-generated method stub
        x2=e.getX();
        y2=e.getY();
        if("直线".equals(shapeType)) {
// g.drawLine(x1, y1, x2, y2);

            //创建图形对象
            MyShape sh=new MyShape();
            sh.shape(x1, y1, x2, y2, shapeType);
            sh.draw(g);
            if(count<99)
                sharr[count++]=sh;

        }
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        //获取动作的事件动作命令 
            String action=e.getActionCommand();                                                        
    shapeType=action;

    }
}

窗体类

package com.panel;

import java.awt.FlowLayout;
import java.awt.Graphics;

import javax.swing.JButton;
import javax.swing.JFrame;

public class eFrame extends JFrame {//继承JFrame
    MyShape[] sharr = new MyShape[100];

    public void showUI() {
        // JFrame frame=new JFrame();
        this.setTitle("画布");
        this.setSize(1000, 600);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        // 设置布局,流式布局
        this.setLayout(new FlowLayout());
        // 添加***
        eListener listener = new eListener();

        String[] shapeArr = { "直线" };
        for (int i = 0; i < shapeArr.length; i++) {
            JButton btn = new JButton(shapeArr[i]);
            this.add(btn);
            btn.addActionListener(listener);
        }
        this.addMouseListener(listener);
        this.setVisible(true);
        Graphics g = this.getGraphics();
        // ***收到画布
        listener.setG(g);
// ***收到数组
        listener.setarr(sharr);
    }

    public void paint(Graphics g) {
        super.paint(g);//继承父类

        System.out.println("ok");
        for (int i = 0; i < sharr.length; i++) {
            if (sharr[i] != null) {//如果有图形对象
                sharr[i].draw(g);//每个图形对象都调用一次绘图方法
            }
        }

    }
    public static void main(String[] args) {
        eFrame f = new eFrame();
        f.showUI();
    }
}

运行一下