为什么我的jscrollpane导致java swing中的奇怪绘制调用?

时间:2009-02-19 19:06:22

标签: java swing graphics jscrollpane

我有一个例程,在滚动窗格内绘制一个疯狂的大图。在添加到滚动窗格之前,要绘制它太大了 - 经典要求将是几次演出。

由于图形的大小,我在滚动窗格的子项的绘制方法中呈现图表。哪个效果很好,但是我注意到每次移动一个滚动条时我的绘图程序被调用两次 - 一次使用一个剪切矩形等于未覆盖的区域滚动到,另一次剪切矩形等于视口的尺寸

例如,如果我的视口是245x195&我向下滚动3个像素,我的绘图例程被调用,g.getClipBounds()设置如下:

java.awt.Rectangle[x=0,y=195,width=245,height=3]
java.awt.Rectangle[x=0,y=3,width=245,height=195]

...因为我在绘图程序中渲染,这导致闪烁(我尽可能快地进行计算,但是我觉得有点延迟)。问题:

  1. 有谁知道如何阻止第二次绘画调用?这是简单的JScrollPane我正在做的事情 - 我有一个组件,我把它添加到滚动窗格,我将滚动窗格添加到父组件。即使在第一个图像滚动演示@ the swing tutorial中也可以看到此行为。

  2. 如果对#1的回答是'nope':有没有人会想到一个好方法来解决这个问题?我应该画一些图像缓冲区,跟踪最近的绘画调用&安培;尽可能复制图像?我无法想象这比重新渲染要快得多,但任何洞察力都得到了赞赏: - )

1 个答案:

答案 0 :(得分:4)

我在.NET世界遇到过这个问题。双缓冲可以解决您的问题。

如果您直接渲染到屏幕上显示的表面上,则无法控制“显示”实际发生的时间。通常发生的事情是:开始渲染,屏幕上显示尚未完成的图像,完成渲染,然后最终显示在屏幕上。

如果您通过清除背景颜色开始渲染逻辑,那么这将显示为闪光灯。双缓冲可以防止这种情况,因为它始终从完成的渲染中显示。可能发生的最糟糕的事情是轻微的“撕裂”,但这在快速改变动画时才会引起注意。

即使您只想渲染巨大图像的一部分,您仍然可以使用此技术。只需将您需要的内容渲染到离屏表面(这是您想要的可见部分的大小)。然后当你完成后,一下子将整个图像绘制到你的显示器表面上。