【发布时间】:2016-02-24 08:44:17
【问题描述】:
我偶然发现了一个我很想解决的瓶颈。
我需要使BufferedImage 随时间增长,但缓冲图像应支持滚动,因为我的应用程序要求缓冲图像随时间增长显着大小。然而,绘图调用不是由事件调度线程完成的。
我有一个执行渲染调用的 while 循环。我试图创建一个Canvas 的实例并将其添加到JScrollPane 但是当我采用这种方法时,JScrollPane 执行自己的绘制调用,我不确定 JScrollPane 将如何检测到画布已调整大小在运行时。
另一个问题是,由于我在画布上使用 BufferedImage 进行绘制,因此无法使用临时 BufferedImage 调整其大小。
这是我尝试创建一个新的、更大的 BufferedImage 的方法
if(needsToBeResized)
{
BufferedImage temporaryBufferedImag =
new BufferedImage(originalImage + extraSpace, height, originalImage.getType());
Graphics g2d = temporaryBufferedImag.createGraphics();
g2d.drawImage(originalImage, 0,0,null);
//I presume that this should copy the graphics object with the original img
originalImage = temporaryBufferedImag;
g2d.dispose();
}
如果有帮助,我正在开发一个示波器类型的应用程序,该应用程序需要能够保持实时绘制值,但我还需要能够显示值的历史记录。
【问题讨论】:
-
只要你修改
getPreferredSize返回的值并调用revalidate,你应该可以让Canvas增长。在这种情况下,我建议使用Canvas中提供的BufferStrategy支持,而不是依赖BufferedImage进行绘画 -
我确实有缓冲策略,使用 BufferedImage 的原因是因为我希望绘图是双缓冲的。
-
你认为
BufferStrategy在做什么?它根据您的需要提供了一个基本的翻页程序(或双缓冲区)...... -
现在我正在考虑,只要我在画布上设置PreferredSize(),BufferStrategy 是否能够动态增长?如果是这种情况,我可以摆脱必须创建更大的 BufferedImage。
-
是的,缓冲区的大小将直接取决于
Canvas的当前大小,只要您允许JScrollPane重新验证布局,它应该可以正常工作。
标签: java canvas bufferedimage