关于画图板的重绘

                  
大家在用JAVA制作画图板时有没有发现一个问题,就是当你在画布上画了一些图形,例如直线,矩形后,把窗体最小化后,在还原,画布上的图形就消失了。这就牵扯到一个画布重绘的问题。
这是因为调用Jpanel画布时,Graphics类里有一个写好了的paint方法是自动调用的,当你最小化窗体或者是改变窗体大小,都会调用paint方法把当前图片清空,所以我们要做的就是重写paint方法,使它在窗体最小化后重新绘制图像。
首先,我们要建立一个Object类的队列,用来存放我们每次画的图像,这个方法可以自己写,
//队列,用于解决画板的重绘
public class MyList {
private Object[] srcArray=new Object[0];
//添加一个元素的方法
  public Object[] getOb()
  {
  return srcArray;
  }
  public void add(Object obj)
  {
  //重新创建一个队列来代替原队列
  Object[] destarray=new Object[srcArray.length+1];
  for(int i=0;i<srcArray.length;i++)
  {
  destarray[i] = srcArray[i];
  }
  destarray[srcArray.length] = obj;
  //吧src的指针来指向dest
  srcArray  = destarray;
  }
这里只是添加了add方法来添加图像,其他方法大家可以自己试着写一写。
然后我们需要写一个shape类来定义我们画的图像,
public abstract class Shapes{
public int x1,x2,y1,y2;
public Color color;
/**
* 构造方法
*/
public Shapes(int x1, int y1,int x2,int y2,Color color)
{
this.x1=x1;
this.y1=y1;
this.x2=x2;
this.y2=y2;
this.color=color;
}
/**
* 抽象画图的的方法
*/
public abstract void draw(Graphics g);
}
这里shapes类我定义的是抽象类型的,就是没有实现的类,我们可以接下来定义Rect,Line等shapes类的子类来实现方法。
import java.awt.Color;
import java.awt.Graphics;
/**
* 矩形的重绘实现
* @author lenovo
*
*/
public class Rect extends Shapes{

public Rect(int x1, int y1, int x2, int y2, Color color) {
super(x1, y1, x2, y2, color);

}

public void draw(Graphics g)
{
g.setColor(color);
g.drawRect(Math.min(x1, x2), Math.min(y1, y2),Math.abs(x2-x1),Math.abs(y2-y1));
}

}
这里只举了一个例子。剩下的大家可以自己写。
接下来我们在鼠标监听里把我们画的图像一个一个存进队列
if(command.equals("line"))
{
shape=new Line(x1,y1,x2,y2,jpanel_color.getJBcolor());
shape.draw(g);
//这里repaintList是我们创建的队列对象
repaintList.add(shape);
}
(这里同样只是一个例子)
监听实现后,我们就可以在重写paint方法了
  public void paint(Graphics g)
  {
  super.paint(g);
  //mouse_listener是鼠标监听器对象,从主类里接收过来
  mouse_listener = dw.getMouseListener();
  //然后创建队列来接受监听器的队列对象
  repaintList1=mouse_listener.repaintList;
  //这是鼠标移动监听器对象,也是一样的接收,
  mma = dw.getMouseMotionListener();
  repaintList2=mma.repaintList;
  //这里用一个for循环来一个个吧图像重绘出来
  for(int i=0;i<repaintList1.getLength();i++)
  {
  //队列是基类Object类型,我们把它强制转换成Shapes类
  ((Shapes) repaintList1.getSrc(i)).draw(g);

  }
  for(int i=0;i<repaintList2.getLength();i++)
  {
  //同样是重绘
  ((Shapes) repaintList2.getSrc(i)).draw(g);

  }
好了现在重绘就完成了。

你可能感兴趣的:(java)