前两天一直被这个问题所困扰.
然后通过看源码和书籍,终于对repaint内部机制有所了解了.
下面简单介绍一下它们的绘制过程;swing重绘主要有四个关键方法:paint(),repaint(),revalidate(),paintImmediately();
而进行绘制时后它会依次调用update(),paint(),paintComponent(),paintBorder(),paintChildren()进行绘制;那么repaint()方法为什么会延时呢?调用repaint()会导致一个区域被增加到重绘列表队列中,且被预定重绘。产生一个防止到系统事件队列中的请求,
一旦该请求被处理,内部工具自动毁掉组件的paintImmediately()方法。然后该方法立即执行绘制;也就是说通常情况下repaint()它是不会立即执行的,调用它后会有一个等待处理的过程。但repaint比较高效,会推迟实际的绘制并将多余的请求压缩到单个 paint 调用中。所以如何解决它的repaint()延时问题呢?
1.让它立即执行:使用paintImmediately()。
2.使用SwingUtilities工具类中的invokeLater(Runnable doRun)方法;把你要在repaint()后执行的操作写在要执行的线程中;(它会把这个方法也加入到java内部事件队列中,它排在repaint()之后,所以一般情况下,它是等repaint()执行完之后才会执行,虽然这样达到效果,但并不理想);
3.自己写一个线程,sleep(),或者使用Timmer类;
希望大家一起讨论,如果有其它的解决办法的也可以一起交流学习。谢谢!

解决方案 »

  1.   

    对了!还有一个类比较重要,RepaintManager 此类管理重绘请求;
    我们所说加入事件队列中,加入的就是它!
    而它还可以得到一些关于绘制相应的信息,它对双缓冲等操作是非常有用的。
    它有个静态RepaintManager.currentManager(Commponet);可以得到当前组件的RepaintManager.有兴趣的可以去看看
      

  2.   

    首先恭喜下!
    另第3个方案感觉很不可靠,因为,paint()方法需要花多少时间,自己写的线程并不知道,所以sleep()中的时间不能设定,只能凭感觉设定一个适当的值,这样的话,就不能保证执行的顺序了。
      

  3.   

    非常感谢cowputer的回复,
    但好象关心此类问题的不多.揭贴啦.