相关疑难解决方法(0)

Java:如何在Swing中进行双缓冲?

编辑二

为了防止讽刺评论和单行答案错过了重点: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)

java swing doublebuffered

17
推荐指数
2
解决办法
3万
查看次数

标签 统计

doublebuffered ×1

java ×1

swing ×1