在使用Java进行画图工具编写时,如果我们改变窗体的状态(隐藏,改变大小),窗体上所有的组件会进行重绘,但我们自己绘制的图形却不再显示,因此我们需要对这些图形进行重绘。
1.根据图形对象设计对应的类,保存当前图形的数据
例:创建Shapes保存数据
public class Shapes {
//属性
public int x1,y1,x2,y2;
public String name;
//构造方法 格式:public 类名(参数类型 参数名,,){ 方法体..}
public Shapes(int x1,int y1,int x2,int y2,String name){
this.name = name;
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
}
public void drawShape(Graphics g){
switch (name){
case "直线":
g.drawLine(x1,y1,x2,y2);
break;
}
}
}
2.创建数组来保存图形对象
public Shapes[] shapeArr = new Shapes[100];
3.将图形对象保存在数组中,并标下标区分
public void mouseReleased(MouseEvent e) {
if ("直线".equals(name)) {
//绘制图形
g.drawLine(x1, y1, x2, y2);
//创建Shapes对象保存数据
Shapes shape = new Shapes(name,x1,y1,x2,y2);
//保存对象到数组中
shapeArr[index] = shape;
index++;
}
4.继承绘制图形的面板类(JPanel),重写该面板的paint方法
例:新建MPanel类去继承JPanel类,即创建一个自定义面板
public class MPanel extends JPanel {
//引用传递
// shapeArr 数组默认值是null
public Shapes[] shapeArr;
//重写paint方法
public void paint(Graphics g){
//1.保留绘制组件
super.paint(g);
System.out.println("paint....");
//2.绘制图形:遍历shapeArr数组
//NullPointerException:空指针异常
//用null 对象调用了方法/属性
for(int i=0;i<shapeArr.length;i++){
Shapes shape = shapeArr[i];
if(shape != null){
shape.drawShape(g);
}else{
break; //跳出循环
}
}
}
}
5.把DrawListener类中shapeArr数组传递给MPanel
drawPanel.shapeArr = listener.shapeArr;