backbuffer VolatileImage调整大小

时间:2013-03-08 12:24:00

标签: java applet double-buffering

我的java applet中有一个关于我的backbuffer的小问题。目前我没有考虑在运行时调整我的applet大小。因此,面板调整大小,而我的后备缓冲区保持其初始大小。因此,只有我的applet的一部分被重绘,这由我的图像大小覆盖。不过我试图用

重新启动图像
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();
        }
    }

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

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

任何建议调整大小而不闪烁?!

亲切的问候。

1 个答案:

答案 0 :(得分:0)

问题:不需要的重绘

闪烁的发生是因为面板正在重新绘制。由于您不希望窗口开始闪烁,因此这些重新绘制是不需要的。如果禁用自动重新绘制,则可以控制applet重绘的时间。您可以做的是在初始化新缓冲区后更改代码以执行重绘。


解决方案,第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();
        }
    }