【问题标题】:JScrollPane: repaint offscreen buffered imageJScrollPane:重绘屏幕外缓冲图像
【发布时间】:2012-03-31 01:40:57
【问题描述】:

我有一个 JScrollPane 组件:

    scroller = new JScrollPane();
    scroller.getViewport().add(bigPanel);
    scroller.getViewport().setDoubleBuffered(true);

bigPanel 被绘制成一个缓冲图像,该图像在启动时显示,一切看起来都正常。我可以上下滚动没有任何问题。但是,当我放大 bigPanel 时,它会更新 bufferedImage,但只保存 JScrollPane 中可见的部分(尺寸正确,只是屏幕外的内容为空白)。

我尝试在滚动条更改时更新缓冲图像,这非常昂贵,并且导致图像在两者之间呈现白色条纹......

   scroller.getVerticalScrollBar().addAdjustmentListener(this);

那么,有没有一种方法可以像一开始那样绘制组件,还是自己编写滚动条更好?

我将尝试编写最少的工作代码,但隔离它有点困难。面板由填充的矩形组成。

【问题讨论】:

  • 您的 bigPanel 是否在背景中设置了图像?如果是,请尝试仅在 paintComponent 方法中调整图像大小..
  • 如何(如在 SCCE 中)将 bigPanel 绘制到缓冲图像上?看起来您正在将滚动窗格绘制到图像而不是实际的 bigPanel。您还想在绘制图像时关闭 bigPanel 上的双缓冲。

标签: java swing jscrollpane bufferedimage


【解决方案1】:

一种方法是使用drawImage() 扩展旧的BufferedImage,而getValueIsAdjusting() 保持不变。仅在调整停止后修改BufferedImage。如果更新很耗时,那么增量更新可能是值得的。

【讨论】:

  • 感谢您的提示,它完美运行!当我使用drawImage() 时,我不需要双缓冲,对吧?
  • JPanel 默认情况下是双缓冲的,所以我会说不。
猜你喜欢
  • 1970-01-01
  • 2014-11-10
  • 2014-08-05
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多