为什么我的jscrollpane会在JavaSwing中导致奇怪的绘制调用?

为什么我的jscrollpane会在JavaSwing中导致奇怪的绘制调用?,java,swing,graphics,jscrollpane,Java,Swing,Graphics,Jscrollpane,我有一个例程,在滚动窗格中绘制一个大得惊人的图形。在添加到滚动窗格之前,它太大了,无法绘制-菜单要求是几格 由于图形的大小,我在scrollpane子级的paint方法中呈现图表。这很好,但是我注意到每次移动滚动条时,我的绘制例程都会调用两次——一次调用与滚动到的未覆盖区域相等的剪切矩形,第二次调用与视口尺寸相等的剪切矩形 例如,如果我的视口为245x195&我向下滚动3个像素,则调用我的绘制例程时使用g.getClipBounds()设置如下: java.awt.Rectangle[x=0,y

我有一个例程,在滚动窗格中绘制一个大得惊人的图形。在添加到滚动窗格之前,它太大了,无法绘制-菜单要求是几格

由于图形的大小,我在scrollpane子级的paint方法中呈现图表。这很好,但是我注意到每次移动滚动条时,我的绘制例程都会调用两次——一次调用与滚动到的未覆盖区域相等的剪切矩形,第二次调用与视口尺寸相等的剪切矩形

例如,如果我的视口为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]
。。。因为我在绘制例程中进行渲染,这会导致闪烁(我尽可能快地进行计算,但我想会有一点延迟)。问题:

  • 有人知道如何防止第二次绘制调用吗?这是我在这里做的简单的jane JScrollPane工作-我有一个组件,我将它添加到滚动窗格,我将滚动窗格添加到父组件。您甚至可以在第一个图像滚动演示@中看到这种行为

  • 如果#1的答案是“否”:有人能想出一个好办法来处理这个问题吗?我应该在某种图像缓冲区中绘制,跟踪最近的绘制调用并尽可能复制图像吗?我无法想象这比重新渲染要快得多,但任何见解都值得赞赏:-)


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

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

    如果通过清除背景色开始渲染逻辑,则这将像闪光灯一样出现。双缓冲防止了这种情况,因为它总是在完成渲染后显示。可能发生的最糟糕情况是轻微的“撕裂”,但这只在快速变化的动画中才明显


    即使只想渲染一幅巨大图像的一部分,也可以使用此技术。只需将所需渲染到屏幕外表面(即所需可见部分的大小)。完成后,一下子将整个图像绘制到显示表面。

    我唯一的问题是无法缓冲整个图像-它太大了。这意味着我需要在绘制缓冲部分时保留它们,在调用我绘制()时检查覆盖率,并根据需要将它们缝合在一起。我想我会尝试一下,但我会等一下,看看是否还有其他人有什么想法。同样,双缓冲仍然可以发挥作用。只需在屏幕外表面(可视部分的大小)上渲染所需的内容。当你完成后,把整个图像一下子画到你的显示屏上。实际上,这是可行的。谢谢:-)滚动稍微慢一点,但闪烁消失了。很抱歉,我没有首先得到它-我的愚蠢无法与你的毅力相匹敌;-)哦,不用担心。在你发表评论之前,我真的不知道你画的东西有那么大。要使它更快,唯一要做的就是改进绘图逻辑,但总是会有一些延迟。祝你好运