上期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);
}
其他图形类比该思路即可
(持续更新)