编辑二
为了防止讽刺评论和单行答案错过了重点:IFF它就像调用setDoubleBuffered(true)一样简单,那么如何才能访问当前的离线缓冲区以便我可以开始搞乱BufferedImage的底层像素数据缓冲区呢?
我花时间写了一段正在运行的代码(看起来也很有趣)所以我真的很感激答案实际上回答(多么令人震惊;)我的问题并解释这是什么/如何工作而不是单行和snarky评论 ;)
这是一段可以在JFrame上反弹的代码.我想知道可以用来转换这段代码的各种方法,以便它使用双缓冲.
请注意,我清除屏幕和重绘方块的方式并不是最有效的,但这实际上不是这个问题的关键(在某种程度上,为了这个例子它更好,它有点慢).
基本上,我需要不断修改BufferedImage中的很多像素(因为有某种动画),我不希望看到由于屏幕上的单缓冲而产生的视觉伪像.
我有一个JLabel,其Icon是一个包装BufferedImage的ImageIcon.我想修改那个BufferedImage.
必须做什么才能使其成为双缓冲?
据我所知,当我在"图像2"上画画时,会以某种方式显示"图像1 ".但是,那么一旦我做借鉴"图像2",我该如何"迅速"替换"图像1"的"图像2"?
这是我应该手动做的事情,比如说,自己交换JLabel的ImageIcon吗?
我应该总是绘制相同的BufferedImage,然后在JLabel的ImageIcon的BufferedImage中快速'blit'的BufferedImage像素?(我猜不是,我不知道我怎么能用显示器的"垂直空白线"[或平板屏幕中的等效物]"同步"这个:我的意思是'同步'而不会干扰显示器本身刷新它的时刻像素,以防止剪切]).
"重漆"订单怎么样?我想我自己触发这些吗?哪个/什么时候应该调用repaint()或其他什么?
最重要的要求是我应该直接在图像的像素数据缓冲区中修改像素.
import javax.swing.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
public class DemosDoubleBuffering extends JFrame {
private static final int WIDTH = 600;
private static final int HEIGHT = 400;
int xs = 3;
int ys = xs;
int x = 0;
int y = 0;
final int r …Run Code Online (Sandbox Code Playgroud)