java中repaint(), paint()问题

来源:百度知道 编辑:UC知道 时间:2024/05/26 23:06:31
我在书上看到说当窗口从最大化,最小化状态还原时,或者被其他窗口覆盖,当其他窗口关闭或移开时,系统都会自动重画标准组件的图形图象,而不会自动重画组件上定制的图形,因此需要调用repaint(),这样的话,我很迷惑,绘制标准组件的线程和绘制组件上定制的图形的线程是同一个线程吗?绘制标准组件的方法也是paint(Graphics g)吗?很多程序中需要在组件上绘制图形,要覆盖父类的paint(Graphics g),请问这个paint能绘制标准组件吗?还有一个问题,自定义paint(Grahpics g)方法中经常会在方法中调用super.paint(g),调用父类的paint有什么作用吗?但是有的在paint(Grahpics g)中却没有super.paint(g),请问这个是怎么回事?谢谢大家了
在自定义的绘图中都会覆盖父类的paint(Graphics g)请问绘制标准组件的函数是否也在这个paint()中呢?是否awt线程调用另外的函数来实现标准组件的绘制?swing组件中的JComponent中的paint()包含paintComponent(), paintBorder(),paintChildren()请问这些函数是否绘制标准组件?在程序中调用repaint()之后,是只有自定义的图形重新绘制,还是和标准组件一起重绘?

对于标准组件,比如按纽等,有个awt线程负责控制,不用我们来处理,这就是你说的系统自动重画.
而对于自己画的东西,比如画布(canvas)、自定义的图象等,则需要自己写程序去控制(repaint)。而自定义图象的绘画就在paint方法中
标准组件一般是用3d画图的。

Java中事件的分配调度是由专门的线程完成的。当调用repaint方法时,实际上是发送一个重绘事件到事件队列,而后事件分配线程会调用paint方法来完成重绘。当在多线程时,一切正常,因为你调用repaint方法的线程没有占据全部的CPU时间,所以事件分配线程可以执行,并调用paint完成重绘。
而在单线程情况下,由于你的线程完全占据了CPU,事件分配线程无法执行,自然也就没法去分配你通过调用repaint方法插入的重绘事件。取代的做法就是直接调用paint(),而不是等待事件分配线程去调用。