在制作画图板的过程中,出现一个问题。当画图板最小化之后,再还原,之前画过的图形会消失,又需要重新画,
但画出来的图形就和之前的不一样了,很不方便。
为解决这个问题,就需要用到画图板重绘。
所谓重绘,就是将把原来画的图形重新在窗体中画出来,即当我们最小化窗体或者弹出颜色选择器时,原来的图形
还出现在窗体上。
那么如何实现重绘?
1、利用泛型队列,将所有我们画过的图形保存在数组中,其中包括图形的种类,位置,及颜色。
2、我们画的图形有直线、矩形、圆等。。因此可以定义一个图形父类。
3、在还原窗体之后自动将数组中的每一个图形元素输出,即重新画出来。便可实现重绘。
?
一、
首先,定义一个抽象父类Shape类,包含坐标和颜色属性以及抽象的画的方法。
?
class="java">public abstract class Shape { int x1,y1,x2,y2; Color color; public abstract void draw(Graphics g); }
?
?
其次,定义一个泛型数组,将图形存入
?
public class MyArray<E> { //定义一个长度为0的初始数组 Object[] src = new Object[0]; //s为要装入容器的数据,在主函数中为图形:MyArray<Shape> shapes = new MyArray<Shape>(); public void add(E s){ //定义新数组,长度是原始数组长度+1 Object[] dest = new Object[src.length+1]; //将原数组中的数据按下标顺序拷贝到新数组 for(int i=0;i<src.length;i++){ dest[i]=src[i]; } //将新元素放到新数组最后一个下标位置 dest[src.length] = s; //将新数组赋给原数组 src = dest; } // 取出对应下标位置的元素 public E get(int index){ //E为返回值类型。 if(index<0||index>=src.length){ throw new RuntimeException("传入的下标超出边界:"+src.length); } return (E)src[index]; } // 容器中的元素个数 public int size(){ return src.length; }
?
?
最后,在主函数中再次画出来,便实现了重绘。
?
public void paint(Graphics g) { // 调用父类的方法来正确的绘制窗体 super.paint(g); //public void paint(Graphics g): //绘制容器。该方法将 paint 转发给任意一个此容器子组件的轻量级组件。 // 遍历形状队列,重新绘制图形 for(int i=0;i<shapes.size();i++){ Shape sh = shapes.get(i); //绘制形状 sh.draw(g); } }
?
?
画板实现步骤总结:
1、主界面的绘制
?需要运用Frame,Grahpics等类。
2、添加按钮监听器
?
?继承鼠标监听器和事件监听器。
??????? 重写actionPerformed()等方法
3、图形类的定义
?
?定义抽象父类Shape包含抽象Draw方法
?绘制的直线、矩形、椭圆等可定义为子类,继承父类并实现Draw方法。
4、调用重绘方法