画图板放大或缩小,移出屏幕后,画的图像就消失了,所以要保存起来,再画一遍!
利用 JFrame或JPanel 的paint:在改变窗体大小时会自动调用的方法
public void paint(Graphics g){}
思路
1、保存图形:创建一个图形类 Shape
图形的属性和方法:
坐标 int
颜色 Color
图形类型 String
drawLine();…
2、在监听器保存图形数据:在绘制这个图形的地方,实例化一个图形对象来保存对应的图形数据
3、将这个图形对象保存到图形数组中
4、重绘:
在paint方法中,
遍历这个数组,
取出图形对象,
调用绘制的方法
以直线为例重绘
图形类Shape
保存:
坐标 int
颜色 Color
图形类型 String
public class Shape {
String name;//图形类型
Color c;//颜色
int x1,x2,y1,y2;//坐标
public Shape(String name,Color c,int x1,int y1,int x2,int y2){
this.name=name;
this.c=c;
this.x1=x1;
this.y1=y1;
this.x2=x2;
this.y2=y2;
}
public void draw(Graphics g){
g.setColor(c);//设置颜色
if(name.equals("直线")){//重绘
g.drawLine(x1, y1, x2, y2);
}
}
画的时候画笔要当做参数传进去,不能作为类的属性保存,不然有时候画不起,不知道为啥,反正就是没搞明白_(:3」∠❀)_
保存单个图形数据
写在鼠标监听器里面,画图形的时候保存起来
int index=0;//图形数据的个数
Shape[] shape=new Shape[1000];//保存图形数据的数组
public void mouseReleased(MouseEvent e){
x2=e.getX();
y2=e.getY();
if(btnstr.equals("直线")){
//保存图形的数据
Shape sp=new Shape(btnstr,g.getColor(),x1,y1,x2,y2);
shape[index]=sp;//图形对象写到图形数组中保存
index++;
g.drawLine(x1, y1, x2, y2);
}
}
重写paint方法
自己写个JFrame或者Panel的类,在类里面继承原本的JFrame或者Panel,然后重写paint函数
public class MyJPanel extends JPanel{
Shape[] shape=new Shape[1000];
public void paint(Graphics g){
super.paint(g);//先调用原本的paint函数画面板
System.out.println("paint");
for(int i=0;i<1000;i++){//遍历图形数组,绘制保存的图形
if(shape[i]!=null){
shape[i].draw(g);//调用函数重绘
}
}
}
}
把监听器里面保存的图形数组赋值给面板里的图形数组
MyJPanel jpDraw=new MyJPanel();//画图面板
DrawListener dl=new DrawListener();//监听器
jpDraw.shape=dl.shape;