我有一个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为我做这件事的方法(如果存在的话)。
是否有可用的示例或有关如何执行此操作的某些方向(如果可能)?