je ne sais plus.我想可以先invalidate() 再revalidate()

解决方案 »

  1.   

    Java 技术中心(Java Technology Centre)的珍品:JViewport 在 JDK 1.3.0 中的行为
    Heather Brailsford
    软件工程师,IBM Hursley Lab
    2002 年 1 月
    您也许已经注意到了,在使用 JDK 版本 1.3.0 的时候,Swing 应用程序中的滚动和缩放操作有时看起来有些抖动,或者在显示最终图像之前,临时图像看起来似乎在闪烁。使用版本 1.2.2 可以使相同的应用程序实现平滑的滚动。本文的技巧解释了为什么会这样。
    Swing JViewport 类定义了在任一时刻图像的可见部分。(请想象通过一个开口观察图像;而滚动改变了观察开口。) JScrollPane 类将滚动条连接至视口。当滚动图像时,视口的可见范围发生了变化。在屏幕上显示新图像的方式取决于所采用的滚动模式。由于从 1.2.2 到 1.3.0 已经改变了缺省的滚动方式,所以如果不显式设置滚动模式,那么同一个应用程序在两种版本上可能有不同的行为。使用 setScrollMode 设置模式,如下所示:setScrollMode(JViewport.SIMPLE_SCROLL_MODE)
    setScrollMode() 可以使用以下三个值,它们是:
    · SIMPLE_SCROLL_MODE:每次滚动都重绘整个滚动屏。这是 1.2.2 中的缺省设置。
    · BACKINGSTORE_SCROLL_MODE:在画图像之前,先将图像缓冲到一个后备存储器里。它提供的性能要优于 SIMPLE_SCROLL_MODE,但是需要额外的内存。在 1.3 中仍支持这一参数,但已不赞成使用它。
    · BLIT_SCROLL_MODE:这一算法在 1.2.2 中引入,用来提高滚动性能。通过位块传输,绘图操作立即在屏幕上发生,而不是在可以显示完整的图像之前把绘图操作缓冲到一个屏外的图像。因为位块传输不必维护一个屏外缓冲区,所以在大多数情况下,它都将提高性能。当滚动一个隐藏在其它窗口后面的图像时,或者当部分图像在屏幕区域以外时,情况可能会不同于此。在这种情况下,将产生一个重新绘图的操作,并且性能将受到负面影响。 
    在 1.2.2 中只有显式设置时才使用位块传输,但是由于已经证明它能显著提高性能,所以在 1.3.0 中位块传输成了缺省的滚动模式。使用位块传输模式的效果之一是,在滚动或缩放时在屏幕上可以看到一些绘图操作的中间过程。对于复杂的图像这一点通常更加明显。如果不能接受这一点,您可以设置成另外一种模式,但是性能方面几乎肯定会受到影响。