java双缓冲问题

java双缓冲问题,java,Java,我的小程序代码没有正确呈现双缓冲区,有什么问题吗?我正在尝试 我正在努力。但是没有找到解决办法。请告诉我我的代码出了什么问题 import java.applet.* ; import java.awt.* ; import java.awt.event.* ; public class Ball extends Applet implements Runnable { // Initialisierung der Variablen int x_pos = 10;

我的小程序代码没有正确呈现双缓冲区,有什么问题吗?我正在尝试 我正在努力。但是没有找到解决办法。请告诉我我的代码出了什么问题

import java.applet.* ;
import java.awt.* ;
import java.awt.event.* ;


public class Ball extends Applet implements  Runnable
{
    // Initialisierung der Variablen
    int x_pos = 10;     // x - Position des Balles
    int y_pos = 100;    // y - Position des Balles
    int radius = 20;    // Radius des Balles

    Image buffer=null;
    //Graphics graphic=null;

    int w,h;

    public void init()
    {
        Dimension d=getSize();
        w=d.width;
        h=d.height;

        buffer=createImage(w,h);
        //graphic=buffer.getGraphics();

        setBackground (Color.black);

    }

    public void start ()
    {
        // Schaffen eines neuen Threads, in dem das Spiel lไuft
        Thread th = new Thread (this);
        // Starten des Threads
        th.start ();
    }

    public void stop()
    {

    }

    public void destroy()
    {

    }

    public void run ()
    {
        // Erniedrigen der ThreadPriority um zeichnen zu erleichtern
        Thread.currentThread().setPriority(Thread.MIN_PRIORITY);

        // Solange true ist lไuft der Thread weiter
        while (true)
        {
            // Verไndern der x- Koordinate
            repaint();

            x_pos++;
            y_pos++;
            //x2--;
            //y2--;

            // Neuzeichnen des Applets


            if(x_pos>410)
                x_pos=20;

            if(y_pos>410)
                y_pos=20;

            try
            {

                Thread.sleep (30);
            }
            catch (InterruptedException ex)
            {
                // do nothing
            }

            Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
        }
    }

    public void paint (Graphics g)
    {

        Graphics screen=null;

        screen=g;
        g=buffer.getGraphics();

        g.setColor(Color.red);


        g.fillOval(x_pos - radius, y_pos - radius, 2 * radius, 2 * radius);


        screen.drawImage(buffer,0,0,this);

    }


    public void update(Graphics g)
    {

        paint(g);
    }

}

我应该做什么更改。绘制屏幕外图像时,上一个图像也会保留在屏幕上。如何从屏幕上删除上一个图像

您没有清除两个渲染之间的缓冲区

加进去怎么样

g.fillRect(0, 0, buffer.getWidth(), buffer.getHeight());

在调用
g.setColor(color.RED)之前,使用背景色(黑色?);g、 Fillova…

看起来您没有在绘图之间清理缓冲区图像。您可以通过将代码更改为:

    g.setColor(Color.red);
    g.fillOval(x_pos - radius, y_pos - radius, 2 * radius, 2 * radius);

    screen.drawImage(buffer,0,0,this);

    g.setColor(Color.green);
    g.fillOval(x_pos - radius, y_pos - radius, 2 * radius, 2 * radius);

这会吸引红色的球,然后把它擦成绿色,所以你会看到一个红色的球留下一条绿色的轨迹。用背景色替换绿色就可以了。

对于初学者,你可以停止发布10个空方法的示例代码。嗨,russel。你只接受了29个问题中的33%。您是否真的收到了20个问题的无法使用的答案?请回顾这一点,并用更详细的信息替换你文章中的“plz-plz-plz-plz”。然后你可能会有更好的机会得到答案。好的,我发现了我的问题。我创建了一个新的图像缓冲区=createImage(w,h);在'screen.drawImage(缓冲区,0,0,this);'然后清理问题解决了。但是现在又出现了另一个问题,我的移动球也在闪烁。所以我想知道这里是否执行了双缓冲。如何检查,任何人都可以帮助??我应用了你的建议,但问题仍然是一样的。事实上,g.setColor(Color.green);这是因为打字错误。应该是注释。问题是屏幕上保留了上一张图片/新写的图片位于上一张图片上,而不是空白图片。如何解决这个问题???@russell,我的建议用另一种颜色覆盖了红色球,因此下一次迭代不应该显示它(使用绿色留下轨迹,使用背景色隐藏球)创建新缓冲区图像的解决方案等同于使用默认颜色覆盖图像。您的问题可能是因为在使用非透明颜色清除图像时背景是透明的吗?我无法理解您的疑问!!,但这不是问题。因为我终于能够通过设置>>scr来消除闪烁een.drawImage(缓冲区,0,0,这个);到屏幕。drawImage(缓冲区,0,0,null);thanx非常感谢您的帮助。希望下次您也能帮助我。我使用了它,但问题仍然是一样的。球仍然随着尾巴移动。我不知道我还能做什么!!!