我有一个JScrollPane
显示(作为它的视口视图)MyPanel
,一个JPanel
.
MyPanel
通过重载实现自定义绘画paintComponent
。的可显示内容的总大小MyPanel
通常很宽(意味着比JScrollPane
视口的大小宽 50 倍到 200 倍)并且使用Timer
,我水平滚动以查看底层的不同部分MyPanel
。我还允许使用滚动条拇指手动寻找MyPanel
.
在我的paintComponent
实现中,我目前正在MyPanel
使用 查找当前在视口中可见的部分JViewport#getVisibleRect
,并且每次更改视口位置时只需绘制该部分。
这很好用——但我最终会MyPanel
一遍又一遍地重新绘制可见部分的很大一部分,因为定时滚动一次只会将视口移动 1/50 的视口宽度。此外,我通常最终会滚动浏览 的整个水平范围MyPanel
,因此无论如何我都必须至少绘制一次。
这让我想到MyPanel
只绘制一次的全部内容(到一个BufferedImage
?),然后让JScrollPane
(或JViewport
)处理剪辑和只对BufferedImage
.
直觉上,在我看来,这似乎是处理这个问题的最有效方式,而且是相对常见的。
当我研究 Swing 教程和其他资源时,我了解到 Swing 已经是双缓冲的。如果我尝试用我自己的蛮力来强制执行此操作,而不依赖于 Swing 功能,听起来我最终会使用三重缓冲。
我还没有找到JScrollPane
为我做这件事的方法(如果存在的话)。
是否有可用的示例或有关如何执行此操作的某些方向(如果可能)?