Java图像闪烁

Java图像闪烁,java,swing,timer,paint,double-buffering,Java,Swing,Timer,Paint,Double Buffering,我可以从谷歌搜索中看到,这个问题被问了很多次,但我发现没有一个解决方案适合我。我正在用Java制作一个带有图像的游戏,你知道,因为游戏通常都有这些东西。但是整个表单一直在闪烁,我无法让它停止。是的,我对它进行了双缓冲并重写了update()方法,虽然这确实有帮助,但闪烁仍然存在。我不知道我的双缓冲是否有问题,或者我是否需要完全不同的东西 起初我认为它可能与clearRect()行有关,但当删除它时,游戏仍然闪烁,但当然不是每次都被清除。所以这根本没用。当减慢计时器时,闪烁几乎完全消失,但我需要将

我可以从谷歌搜索中看到,这个问题被问了很多次,但我发现没有一个解决方案适合我。我正在用Java制作一个带有图像的游戏,你知道,因为游戏通常都有这些东西。但是整个表单一直在闪烁,我无法让它停止。是的,我对它进行了双缓冲并重写了update()方法,虽然这确实有帮助,但闪烁仍然存在。我不知道我的双缓冲是否有问题,或者我是否需要完全不同的东西

起初我认为它可能与clearRect()行有关,但当删除它时,游戏仍然闪烁,但当然不是每次都被清除。所以这根本没用。当减慢计时器时,闪烁几乎完全消失,但我需要将其减慢到100ms,即使如此,我仍然会得到一些闪烁。此外,这对游戏来说太慢了。我试着让一个计时器在10毫秒的计时器上做所有的事情,另外一个100毫秒的计时器用来画画,但它看起来很紧张。我可以将绘画计时器的速度降低到30毫秒左右,使其保持平稳,尽管闪烁仍然是一个问题

必须有一种方法可以每10-30毫秒执行一次,而不会闪烁。是否有其他类似于双缓冲但在这种情况下更好的方法,或者我可以使用的方法?提前感谢您的帮助

public class main extends JApplet implements ActionListener {
    //This Declares The Variables
    Graphics2D buffer;
    Image offscreen;
    Timer timGame = new Timer(10, this);
    //other variables

    public void init(){
        //This Creates The Offscreen Buffer Zone
        offscreen = createImage(getSize().width, getSize().height);
        buffer = (Graphics2D)offscreen.getGraphics();
        //other initialization stuff irrelevant to drawing
    }

    public void actionPerformed(ActionEvent evt){
        if (evt.getSource() == timGame)
            runGame();
    }

    private void runGame(){
        //Do stuff, move objects
        repaint();
    }

    public void paint(Graphics g){
        super.paint(g);

        buffer.clearRect(0, 0, getSize().width, getSize().height);
        //draw stuff to buffer
        g.drawImage(offscreen, 0, 0, this);
    }

    public void update(Graphics gr){
        paint(gr);
    }

不要直接在顶级窗口(如JApplet或JFrame)的
paint(…)
方法中绘制,因为您会丢失所有双缓冲和所有Swing功能。取而代之的是,绘制添加到JApplet的JPanel或其他JComponent派生组件(包括JComponent本身)的
paintComponent(…)
方法

如果你在这里或谷歌上搜索这个主题,你会发现这个问题在这个网站和其他网站上被问了很多次,回答也是一样的

e、 g

如果试图过快地更新屏幕,您是否看到了可能的重复?60赫兹的刷新率大约为每帧17毫秒…清除super.paint()行修复了该问题。我就知道是那样的蠢事。我想这就是我正常地画它,然后稍后回来加倍缓冲的结果。我还将研究PaintComponent,尽管我现在有点忙着研究它。希望它也能有所帮助,尽管至少目前这种闪烁已经完全停止。我甚至可以把计时器调回10毫秒:)非常感谢。