上期Java画板开发将画笔功能实现做了简单的说明,本期来解决窗口改变后对象消失的问题。

一、问题分析

        JFrame其中有一个特性,即当窗口发生改变后,JFrame会调用其中的repaint方法来刷新窗口。因此对于画板来说,只要每次改变窗口大小后,原先绘制的图形将会消失,因此需要通过一个数据结构对画板上的内容进行保存,并在窗口发生变化时重新绘制。

二、重绘方法设置

        1、数据结构设置

                Java自身并没有比较合适的数据结构能够用于保存形状,因此我们需要自己定义一个数据结构用于保存图形。由前一期的开发思路可以得知,绘制图形最基础的部分即需要直到各个点的坐标,通过坐标并调用相应的绘制函数才能绘制图形。因此在我们自己定义的数据结构中需要考虑如下几个值:起点坐标,终点坐标,图形标识,画笔颜色。因此在定义过程中可以这样定义

public class ShapeList {
    public int x1 , y1 , x2 , y2 ;//对象的起点和终点
    public String name;//图形标识
    public Color col;//画笔颜色

    ShapeList(int x1 , int y1 , int x2 , int y2 , String name , Color col){
        this.x1 = x1;
        this.y1 = y1;
        this.x2 = x2;
        this.y2 = y2;
        this.name = name;
        this.col = col;
    }
}

        2、对象存储

                定义好数据结构之后需要在执行绘画功能的类中对数据进行保存。这里用于绘画的类是DrawMouse类。这里首先示范直线图形的保存,首先是初始化之间我们创建好的数据结构,并在每次绘制完直线后将起点、终点、图形标识存入数组中

public static ShapeList [] shapeArr1 = new ShapeList[ShapeSaveSize];//定义数组
public void mousePressed(MouseEvent e) {
        x1 = e.getX();
        y1 = e.getY();
    }

 public void mouseReleased(MouseEvent e) {
        x2 = e.getX();
        y2 = e.getY();
         graphics02.drawLine(x1 , y1 , x2 , y2);
         ShapeList shapeList = new ShapeList(x1 , y1 , x2 , y2 ,MainPanel.name , MainPanel.color);//初始化对象并保存点
         shapeArr1[Index] = shapeList;将对象值传递给定义的数组
         Index += 1;//设置列表位置,保存完毕后挪至下一位
    }

        3、对象重绘

                当图形对象保存到数组中后,就要在重绘的方法中读取数组并将图形绘制出来。由于我们要使用repaint,原本JFrame中的方法无法满足我们的需求,此时需要重写方法,这里使用Myframe类对JFrame进行重写

public class MyFrame extends JFrame{

    @Override
    public void paint(Graphics g) {
        super.paint(g);

        //遍历数组
        for (int i = 0; i < DrawMouse.shapeArr1.length; i++) {
            //当数组不为空
            if(DrawMouse.shapeArr1[i] != null){
                //从数组中取出图形参数
                ShapeList shapeList = DrawMouse.shapeArr1[i];
                //将数据传到画笔
                shapeList.DrawImage(g);
            }else {
                break;
            }
        }
    }
}

这里需要注意的是,如果需要重绘方法生效,则需主类继承上述方法。

        由于在DrawMouse中初始化ShapeList对象,因此我们只需在ShapeLIst类中创建一个绘画的方法并在DrawMouse中调用即可实现重绘方法

public void DrawImage(Graphics g){
            g.setColor(col);
            g.drawLine(x1 , y1 , x2 , y2);
  
    }

其他图形类比该思路即可

(持续更新)