paint(g) ,一个回调方法,绝大多数时候组件的绘图逻辑都存储于这个方法中。awt系统会在适当的时候调用这个方法对组件进行绘图。容器在绘制的时候,容器的paint(g)方法默认会显示通知在容器中存在的所有visible为true的子组件进行绘制.
awt调用这个方法有2种形式。程序驱动方式和系统驱动方式。
在系统驱动的情况下(比如界面第一次显示组件),系统会判断组件的显示区域,然后向事件分发线程发出调用paint(g)的命令.
程序驱动则由外部的程序调用repaint()方法提出一个异步请求.repaint方法会调用update(g)法,update方法在默认情况下简单调用paint(g)方法.从而绘制组件.
一般不提倡将组件的具体绘制逻辑放到paint(g)之外,也不提倡程序直接调用paint(g)方法.需要注意的是,由于程序驱动方式是由程序来负责组件的绘制,所以repaint方法拥有几个重载方法.传入绘制区域,由程序决定组件的绘制区域.
- repaint()方法用于重绘组件,该方法有下面四种形式:
- 1。public void repaint()
- 2。public void repaint(long tm)
- //指定调用update方法之前等待的最大毫秒数tm
- 3。public void repaint(int x,int y,int width,int height)
- //重绘组件的指定矩形区域
- 4。public void repaint(ling tm,int x,int y,int width,int height)
- repaint方法不总是马上执行,Java虽然会尽可能快的执行repaint,当Applet运行在较慢的平台上或计算机较忙时,应该考虑使用第2或4种repaint方法,指定在多长时间内必须执行repaint,否则就放弃。
- Update()方法用于更新组件,AWT调用该方法以响应对repaint()的调用,在调用update()或paint()之前,组件的外观将不会发生改变。它更新组件的步骤为:通过充填组件的背景色来清除该组件,然后,设置图形上下文(其原点为该组件的左顶点)的颜色为该组件的前景色,最后,调用paint方法完整地重绘该组件。该方法的原型为:
- Public void update(Graphics g)
- Paint()方法用于绘制组件,当需要绘制组件的内容时调用该方法。该方法的原型为:
- Public void paint(Graphics g)
update(g)方法.在awt的重量级组件上,update是一个很重要的方法.在外部程序调用repaint的时候,都会调用到update.程序员通过继承重量级组件,覆盖这个update方法.可以实现自己的绘图逻辑,典型的用法是重新绘制组件需要改变的的一部份而不是全部(增量绘图).这样对于复杂的
组件绘制可以提高效率,不然在默认情况下,重量级组件的update将擦除组件的整个区域,并重新调用paint()方法从头绘制.不过轻量级组件不能采用这个方法.这是由于轻量级组件的本质造成的:
重量级组件和轻量级组件的区别,在于前者拥有一个本地同位体,绘制和现实逻辑都是依靠本地系统来完成.而轻量级组件不依赖于任何本地系统.只需要一个重量级容器组件作为载体.在重量级组件的基础上,完全采用java的绘制代码(个人理解为graphics)来生成.所以轻量级组件在不显示的时候是透明的.甚至可以认为本组件不存在.由于轻量级组件没有采用任何本地系统代码来进行绘制,所以在需要绘制的情况下需要awt显式的通知,当这个通知来自于轻量级组件(就是指组件尺寸改变)而非本地系统时(指组件第一次进行绘制),这个通知采用调用repaint方法的形式进行.换句话说,对于轻量级组件,即使是系统级驱动绘图,也可能会调用repaint方法.而repaint方法将会调用update方法,update方法默认调用paint方法.所以轻量级组件在系统驱动和程序驱动方式上的绘图并没有什么区别.
即使如此,也有办法对复杂的轻量级组件进行有效的增量绘图.复杂的轻量级组件都可以做成容器.可以根据一些内部信息,只绘制轻量级组件中某几个组件.典型做法是覆盖paint方法.