重绘的实现
在以前制作的简单画板中,每当变动窗体时画出的图形都会消失,这个问题就需要通过重绘来实现。
重绘的原理:屏幕上的所有东西事实上都是由一个个的点绘制而成,包括窗体本身。JFrame类中有一个方法paint(),每当打开窗体时系统都会自动调用这个方法,把窗体画出来。
那么要想在窗体变动时窗体上画出的图案和窗体一样仍然存在,可以在定义时重写paint()的方法,在其中写上画这些图形的方法。这样,就需要从事件处理类中获得一些坐标,由于坐标的数量不定,而且画的基本图形不定,可以用队列存储这些信息。队列中的每个元素是一个数组,用数组中的第一个元素存储画的基本图形。
1、在事件处理类中,定义一个队列作为属性,存储坐标
2、在写绘制方法时,每次画基本图形时都新建一个数组存储坐标,把数组加入队列,同时用数组中指定的元素表示基本图形的种类(比如下面的例子中我用每个数组的第一个元素表示图形的种类)
3、在paint()方法中调用事件处理类中队列的数据,根据表示图形种类的元素的值绘制图形
如下是重绘谢尔宾斯基地毯的部分代码:
1、在事件处理类中,定义一个队列作为属性,存储坐标
/** * 重写JFrame中的paint方法 */public void paint(Graphics g){super.paint(g); for(int i=1;i<=Listener.mylinklist.size();i++){ ListNode<int[]> array=Listener.mylinklist.getNode(i); int[] a=array.getData(); if(a[0]==21){ g.setColor(Color.BLACK); g.drawRect(a[1]+200,a[2],a[3],a[4]); }else if(a[0]==31){ g.setColor(Color.BLACK); g.fillRect(a[1]+200,a[2],a[3],a[4]); }else if(a[0]==20){ g.setColor(Color.WHITE); g.drawRect(a[1]+200,a[2],a[3],a[4]); } }}