关于画图板的重绘

大家在用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);

}
好了现在重绘就完成了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值