【问题标题】:Make a dynamically re-sized, BufferedImage, scroll, that renders actively制作一个动态调整大小的 BufferedImage 滚动,主动呈现
【发布时间】: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


【解决方案1】:

在其自己的“迷你”BufferedImage 中渲染每个间隔。因此,举个粗略的例子,假设您每秒渲染一次,并且想要显示 20 秒的历史记录。

因此,您将当前的秒数渲染为“1 秒大小”的图像。然后,您将前 19 秒的图像缓存起来,并将它们一个接一个地标记到新的总图像中,并显示出来。

下一秒,您丢弃最旧的图像,创建一个新图像,将其粘贴到最后,冲洗并重复。

如果您的整体帧大小发生变化,那么当您重新渲染所有片段时……c'est la vie。

显然,您将在一秒钟内采样不止一次,但您已经了解了它的要点。

所有这些都假设这比每次从头开始重新渲染整个东西要便宜。

【讨论】:

    猜你喜欢
    • 2017-08-25
    • 2021-11-26
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多