Java backbuffer挥发图像调整大小

Java backbuffer挥发图像调整大小,java,applet,double-buffering,Java,Applet,Double Buffering,关于java小程序中的backbuffer,我有一个小问题。目前我还没有考虑在运行时调整小程序的大小。因此,面板将调整大小,而我的backbuffer将保持其初始大小。因此,只有我的小程序的一部分会被重绘,它被我的图像大小所覆盖。尽管如此,我还是试着用语言来控制这一形象 private void createBackBuffer() { backBuffer = this.getGraphicsConfiguration().createCompatibleVolatileImage(g

关于java小程序中的backbuffer,我有一个小问题。目前我还没有考虑在运行时调整小程序的大小。因此,面板将调整大小,而我的backbuffer将保持其初始大小。因此,只有我的小程序的一部分会被重绘,它被我的图像大小所覆盖。尽管如此,我还是试着用语言来控制这一形象

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();
        }
    }
不幸的是,它的行为不值得欣赏。一旦用户开始拖动以调整浏览器窗口的大小,重新创建意味着在一小段时间内没有backbuffer可供绘制。因此,面板在闪烁,要么是灰色背景,要么是以前的面板,要么是我要渲染的实际图形

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

有没有建议在不闪烁的情况下调整大小

亲切问候。

问题:不必要的重新喷漆 发生闪烁是因为面板正在重新喷漆。这些重绘是不需要的,因为您不希望窗口开始闪烁。如果禁用自动重新绘制,则可以控制小程序重新绘制的时间。您可以做的是更改代码,以便在初始化新缓冲区后执行重新绘制


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

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