java - 连续双缓冲解决方案不起作用

标签 java awt java-8 doublebuffered

我正在尝试使用 AWT 在 paint() 方法中对包含多边形的图像进行双缓冲。使用 Image 对象进行缓冲过程,我将图像背景设置为黑色,将多边形绘制到图像上,然后将缓冲图像绘制到屏幕上。然后,我调用 repaint() 以再次渲染图像。

不幸的是,我在重新绘制图像时仍然收到伪影。我做错了什么?

编辑:顺便说一句,我正在使用 Java 8。 编辑2:我在paint()中调用repaint(),因为我需要连续缓冲图像 。多边形旨在根据用户输入在屏幕上进行平移。

import java.applet.Applet;
import java.awt.*;

public class DoubleBuffer extends Applet {
    int xSize = 900;
    int ySize = 600;

    Image bufferImage;
    Graphics bufferG;

    @Override
    public void init() {
        this.setSize(xSize, ySize);

        //Double buffering related variables
        bufferImage = this.createImage(xSize, xSize);
        bufferG = bufferImage.getGraphics();
    }

    //BUFFERING DONE HERE
    @Override
    public void paint(Graphics g){
        //drawing images to external image first (buffering)
        bufferG.setColor(Color.BLACK);
        bufferG.fillRect(0,0,xSize,ySize);
        bufferG.setColor(Color.WHITE);
        bufferG.drawRect(100, 100, 100, 100);

        //draw the image and call repaint
        g.drawImage(bufferImage, 0, 0, this);
        repaint();
    }
}

最佳答案

问题是您没有重写 update ,该方法将响应 repaint 请求而调用。对于重量级组件,update 的默认实现将首先将组件清除为背景颜色(可能默认为白色),然后调用您的 paint 方法。

正如其他人所指出的,您不应在 paint 方法中调用 repaint。您应该使用计时器

清理后,整个类将如下所示:

public class DoubleBuffer extends Applet {
    int xSize = 900;
    int ySize = 600;

    Image bufferImage;
    Graphics bufferG;
    Timer timer=new Timer(200, ev->repaint());

    @Override
    public void init() {
        this.setSize(xSize, ySize);
    }

    @Override
    public void addNotify() {
        super.addNotify();
        //Double buffering related variables
        bufferImage = this.createImage(xSize, xSize);
        bufferG = bufferImage.getGraphics();
        timer.start();
    }

    @Override
    public void removeNotify() {
        super.removeNotify();
        bufferImage = null;
        bufferG = null;
        timer.stop();
    }


    //BUFFERING DONE HERE
    @Override
    public void paint(Graphics g){
        //drawing images to external image first (buffering)
        bufferG.setColor(Color.BLACK);
        bufferG.fillRect(0,0,xSize,ySize);
        bufferG.setColor(Color.WHITE);
        bufferG.drawRect(100, 100, 100, 100);

        //draw the image and call repaint
        g.drawImage(bufferImage, 0, 0, this);
    }

    @Override
    public void update(Graphics g) {
        // now not clearing the background as we expect paint() to fill the entire area
        this.paint(g);
    }
}

关于java - 连续双缓冲解决方案不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30356321/

相关文章:

java - Hibernate:保存多个关联问题

Java TimeZone.getTimeZone ("PDT")不工作

java - 通过iBATIS将数据插入PostgreSQL数据库不起作用

java - Desktop.getDesktop().browse 挂起

java - 选项中的映射无法应用于<方法引用>

java - 为什么是 'variable can be only null at this location' ?

Android 中的 java.awt.Point 类

java - 在 Java 中有什么方法可以通过指定 x 和 y 位置来获取 AWT 组件对象?

java-8 - 给定带有 getOrDefault 的键,更新 hashmap 值

java - Elasticsearch 安装 : Error missing 'server' JVM at . ..jvm.dll