Avatar billede longshanks Nybegynder
04. november 2002 - 17:23 Der er 1 kommentar og
1 løsning

Applet, double buffering og det haker alligevel

Jeg har en simpel applet, der har en firkant jeg kan styre med piletasterne rundt i vinduet. Jeg bruger double buffering, men den hakker alligevel.... WAS IST LOS?

Herunder ses min updatemetode: fundet herpå eksperten leveret af disky:
public void update( Graphics g )
    {
        if (dbon)
        {
            updateDoubleBufffered( g );
        }
        else
        {
            super.update( g );
        }
    }
   
    // Do the drawing to an offscreen buffer -- maybe
    private void updateDoubleBufffered( Graphics g )
    {
       
        // Let\'s make sure we have an offscreen buffer, and that
        // it\'s the right size.  If the applet has been resized,
        // our buffer will be the wrong size and we need to make
        // a new one
        Dimension d = getSize();
        if (offscreen == null || width!=d.width || height!=d.height || offscreen==null)
        {
            width = d.width;
            height = d.height;
            if (width>0 || height>0)
            {
                offscreen = createImage( width, height );
            }
            else
            {
                offscreen = null;
            }
        }
       
        // If we still don\'t have one, give up
        if (offscreen == null) return;
       
        // Get the off-screen graphics object
        Graphics gg = offscreen.getGraphics();
       
        // Clear the off-screen graphics object
        gg.setColor( getBackground() );
        gg.fillRect( 0, 0, width, height );
        gg.setColor( getForeground() );
       
        // Draw to the off-screen graphics object
        paint( gg );
       
        // We don\'t need this Graphics object anymore
        gg.dispose();
       
        // Finally, we transfer the newly-drawn stuff right to the
        // screen
        g.drawImage( offscreen, 0, 0, null );
    }
Avatar billede gybel Nybegynder
05. november 2002 - 15:12 #1
Jeg har ingen problemer med at få dobbeltbuffering til at virker jeg bruger dog update til at kalde paint metoden.

public class TextScroller extends Applet
    implements Runnable
{

    public TextScroller()
    {
        tråd = null;
        start = 200;
        delay = 0;
    }

    public void init()
    {
        besked = getParameter("text");
        delay = 100;
        d = getSize();
        bufferImage = createImage(d.width, d.height); //opretter bufferimage

        bufferG = bufferImage.getGraphics(); //opretter buffer objekt
        tråd = new Thread(this);
        tråd.start();
    }

    public synchronized void update(Graphics g) //update kalder paint!!!!
    {
        paint(g);
    }

    public synchronized void paint(Graphics g)
    {
        if(bufferG != null)
        {
            bufferG.setColor(Color.green.darker().darker().darker().darker());//begynder at tegne mit offscreen billede
            bufferG.fillRect(0, 0, d.width, d.height);
            bufferG.setColor(Color.white);
            bufferG.setFont(new Font("Verdana", 20, 20));
            bufferG.drawString(besked, start, 23);
            g.drawImage(bufferImage, 0, 0, this);//tegner det færdige billede ind i appletten
            if(start < -300)
                start = 200;
            start--;
        }
    }

    public void run()
    {
        do
        {
            update(getGraphics());
            try
            {
                Thread.sleep(delay);
            }
            catch(Exception exception) { }
        } while(true);
    }

    public Thread tråd;
    public String besked;
    public int start;
    Image bufferImage;
    Graphics bufferG;
    int delay;
    Dimension d;
}
Avatar billede longshanks Nybegynder
05. november 2002 - 15:56 #2
takker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester