前言
我们画图板上的内容如果不加重绘的话就是一次性的,只要我的画板被隐藏或是扩大,画板上的内容就会消失。
在我之前的内容里,我实现了一个基础的画线内容,它的源代码是这样的
public void mouseDragged(MouseEvent e) {
g.setColor(Color.white);
g.drawLine(x1, y1, x3, y3);//将上一次的线涂白
x2=e.getX();
y2=e.getY();
g.setColor(Color.black);
g.drawLine(x1, y1, x2, y2);
x3=x2;
y3=y2;
而这会出现什么问题呢,
如果我们在下一次的拖动操作中将拖动的线移到之前的线上,之前的线就会被擦除,这是由于“涂白”代码造成的。为了解决这个问题,我们想到实现重新
创建新的类记录坐标
import java.awt.Color;
import java.awt.Graphics;
public class Shape{
public int x1,y1,x2,y2;
void drawShape(Graphics g) {
g.setColor(Color.black);
g.drawLine(x1, y1, x2, y2);
}
}
我们在这个类里写入了一个画线的函数,这个函数也可以写在别处,新类的主要作用是记录坐标
在我们的监听器的类里边创建个Shape对象数组用于记录坐标
public Shape []a=new Shape[100];
int index=0;
public void mouseReleased(MouseEvent e) {
x2=e.getX();
y2=e.getY();
Shape shape=new Shape();
shape.x1=x1;
shape.y1=y1;
shape.x2=x2;
shape.y2=y2;
a[index++]=shape;
}
这样就存入了一个shape对象的信息
重绘的实现
很简单,只需要在画白线的后面加上重绘就行
public void mouseDragged(MouseEvent e) {
g.setColor(Color.white);
g.drawLine(x1, y1, x3, y3);
for(int i=0;i<a.length;i++) {
System.out.println("重绘");//用于检测是否实现
Shape shape=a[i];
if(a[i]!=null)
shape.drawShape(g);
else
break;
}
x2=e.getX();
y2=e.getY();
g.setColor(Color.black);
g.drawLine(x1, y1, x2, y2);
x3=x2;
y3=y2;
}
整个界面的重绘
要实现这个功能我们需要改写我们的paint函数
paint函数本身隐含在我们的JFrame里面,在我们的框架发生大小改变的时候会自动调用,我们现在要给它增添一些内容,并且保留原来的内容
public void paint(Graphics g) {
super.paint(g);//继承父类的功能
for(int i=0;i<a.length;i++) {
System.out.println("重绘");
Shape shape=a[i];
if(a[i]!=null)
shape.drawShape(g);
}
}
小结
以上就是关于重绘的一些简单实现