【发布时间】:2015-08-02 02:14:05
【问题描述】:
我正在尝试使用 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();
}
}
【问题讨论】:
-
有什么理由不使用默认双缓冲的轻量级组件(例如JPanel)? (我建议不要在
paint方法中调用repaint) -
这听起来很奇怪,但由于我在工作中遵循的某些 API 限制,我一直坚持使用重量级组件(即只是窗口)(请多多包涵)。如果一切都失败了,我会继续使用轻量级组件。我即将开始进行更多研究,但是在paint() 中使用repaint() 有什么问题?我还应该在哪里重新渲染我的图像?
-
P.S.这是一项与教育相关的工作,其中图像渲染只占一小部分 - 遗憾的是,我在这方面的经验很少。
-
您应该在
paint方法中渲染(或paintComponent用于轻量级组件),但在任一方法中调用repaint都会导致它一次又一次地连续绘制, 并且...只有在发生变化时才需要致电repaint。 -
如果您希望它按时间间隔重绘,请使用
Timer,或者仅在用户交互/更改值时调用重绘。
标签: java awt java-8 doublebuffered