【问题标题】:backbuffer VolatileImage resize后缓冲 VolatileImage 调整大小
【发布时间】:2013-03-08 12:23:59
【问题描述】:

我的 Java 小程序中有一个关于我的后备缓冲区的小问题。目前我还没有考虑在运行时调整我的小程序的大小。因此面板被调整大小,而我的后台缓冲区保持其初始大小。因此,只有我的小程序的一部分被重绘,这被我的图像大小所覆盖。尽管如此,我还是尝试使用

重新初始化图像
private void createBackBuffer() {
    backBuffer = this.getGraphicsConfiguration().createCompatibleVolatileImage(getWidth(), getHeight());
    defaultComposite = ((Graphics2D) backBuffer.getGraphics()).getComposite();
    defaultStroke = ((Graphics2D) backBuffer.getGraphics()).getStroke();
}

// Reinit on resize
    public void adjustBackBufferSize() {
        if (backBuffer != null) {   
            backBuffer.flush();
            createBackBuffer();
        }
    }

不幸的是,它表现得并不欣赏。一旦用户开始拖动以调整浏览器窗口的大小,娱乐意味着在一小段时间内没有后台缓冲区可绘制。因此面板在闪烁,要么是灰色背景,要么是以前的面板,要么是我即将渲染的实际绘图。

我考虑在调整大小时设置宽度和高度的偏移量以降低闪烁行为,但这似乎仍然不是正确的方法,只是一种解决方法。

有没有不闪烁的调整大小的建议?!

亲切的问候。

【问题讨论】:

  • “目前我还没有考虑在运行时调整我的小程序的大小。” Sun 希望小程序具有固定大小。在网页中调整大小的 Applet 一直不可靠。我不会花时间担心它。
  • 不过,JApplet 具有转发用户调整大小操作的功能。无论如何,它对我来说仍然很重要。我实际上可以增加初始大小,但这仍然没有让我感觉很好。

标签: java applet double-buffering


【解决方案1】:

问题:不需要的重绘

出现闪烁是因为面板正在重新绘制自身。这些重绘是不需要的,因为您不希望窗口开始闪烁。如果您禁用自动重绘,那么您将控制您的小程序何时重绘。您可以做的是更改代码以在新缓冲区初始化后执行重绘。


解决方案,第 1 部分:禁用重绘

您应该尝试以下方法:

setIgnoreRepaint(true);

如果这不起作用,请尝试使用 main() 方法将其添加到类中:

static {
    System.setProperty("sun.awt.noerasebackground", "true");
}

这应该会为您禁用自动重绘,但可能需要指示其他一些组件也不要自动重绘自己。如果您发布 SSCCE,我可以为您提供更多帮助。此外,运行一些测试以查看您的应用程序是否仍能正常工作——您可能需要添加一些 repaint() 调用,例如在最小化和恢复期间。


解决方案,第 2 部分:按需重绘

由于您希望在 backBuffer 初始化后进行重绘,请将您的代码更改为:

    // Reinit on resize
    public void adjustBackBufferSize() {
        if (backBuffer != null) {   
            backBuffer.flush();
            createBackBuffer();
            repaint();
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    相关资源
    最近更新 更多