Java swing podwójne buforowanie

witam, napisałem program na którym jest rysowany kwadrat i porusza się on. chciałem aby ktoś mi sprawdził czy dobrze zaimplementowałem podwójne buforowanie. oto kod programu

/*

 * To change this template, choose Tools | Templates

 * and open the template in the editor.

 */

package javaswingkwadrat;


import java.util.TimerTask;

/**

 *

 * @author marcin

 */

public class KlasaZadanie extends TimerTask{


    int pozX = 50;

    int pozY = 50;

    int kierunek = 1;

    int licznik = 1;


    @Override

    public void run() {

        switch(kierunek){

            case 1:

                licznik++;

                pozX++;

                if(licznik == 600){

                    licznik = 0;

                    kierunek = 2;

                }

                break;

            case 2:

                licznik++;

                pozY++;

                if(licznik == 400){

                    licznik = 0;

                    kierunek = 3;

                }

                break;

            case 3:

                licznik++;

                pozX--;

                if(licznik == 600){

                    licznik = 0;

                    kierunek = 4;

                }

                break;

            case 4:

                licznik++;

                pozY--;

                if(licznik == 400){

                    licznik = 0;

                    kierunek = 1;

                }

                break;

        }

    }


}

/*

 * To change this template, choose Tools | Templates

 * and open the template in the editor.

 */

package javaswingkwadrat;


import java.awt.Color;

import java.awt.Dimension;

import java.awt.Graphics;

import java.awt.Image;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.Timer;

import javax.swing.JFrame;

import javax.swing.JPanel;


/**

 *

 * @author marcin

 */

public class KlasaKwadrat extends JFrame{


    private int width = 800;

    private int height = 600;

    private Dimension dimension = new Dimension(width, height);

    JPanel jPanel = new JPanel(true);

    KlasaZadanie klasaZadanie = new KlasaZadanie();

    Timer timer;

    Image bufor;

    Graphics bg;


    public KlasaKwadrat() {

        setTitle("ruchomy kwadrat !");

        setSize(dimension);

        setResizable(false);

        setVisible(true);

        setDefaultCloseOperation(EXIT_ON_CLOSE);

        add(jPanel);


        bufor = createImage(width, height);

        bg = bufor.getGraphics();

        timer = new Timer(10, new ActionListener() {


            @Override

            public void actionPerformed(ActionEvent e) {

                klasaZadanie.run();

                repaint();

            }

        });

        timer.start();

    }


    @Override

    public void update(Graphics graphics){

        bg.clearRect(0, 0, width, height);

        paint(bg);

        graphics.drawImage(bufor, 0, 0, jPanel);

    }


    @Override

    public void paint(Graphics graphics){

        super.paint(graphics);

        graphics.setColor(Color.red);

        graphics.fillRect(klasaZadanie.pozX, klasaZadanie.pozY, 100, 100);

    }

}

/*

 * To change this template, choose Tools | Templates

 * and open the template in the editor.

 */

package javaswingkwadrat;


import javax.swing.SwingUtilities;


/**

 *

 * @author marcin

 */

public class JavaSwingKwadrat {


    /**

     * @param args the command line arguments

     */

    public static void main(String[] args) {

        // TODO code application logic here

        SwingUtilities.invokeLater(new Runnable() {


            @Override

            public void run() {

                KlasaKwadrat klasaKwadrat = new KlasaKwadrat();

            }

        });

    }

}[/code]