Mam napisać prace licencjacka na temat algorytmów sortujących, mam problem z narysowaniem przebiegu algorytmu po danych. Pisze w Javie korzystam z JFrame JPanel i w panelu z funkcji PaintCompnent. Staram się z wizualizować działanie sortowania bąbelkowego, algorytm przechodzi przez dane i na koniec rysuje posortowane dane jednak nie potrafię narysować poszczególnych kroków (co z czym porownuje). Teoretycznie to tylko i+1 ale coś nie działa.
Wzoruje się na http://www.home.umk.pl/~abak/wdimat/s/Index.html
Ktoś mógłby rzucić okiem?

frame.java

package frame;

import java.awt.Color;

public class Frame extends javax.swing.JFrame {

    Rysuj rysuj;
    Watek w = new Watek();
    
    public Frame() {
        initComponents();
        rysuj=new Rysuj();
        rysuj.setBackground(new Color(240,255,255));
        rysuj.setBounds(0, 0, 1200, 600);
        rysujJPanel.add(rysuj);
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        rysujJPanel = new javax.swing.JPanel();
        menuJPanel = new javax.swing.JPanel();
        sortujJButton = new javax.swing.JButton();
        startJButton = new javax.swing.JButton();
        zatrzymajJButton = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        javax.swing.GroupLayout rysujJPanelLayout = new javax.swing.GroupLayout(rysujJPanel);
        rysujJPanel.setLayout(rysujJPanelLayout);
        rysujJPanelLayout.setHorizontalGroup(
            rysujJPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 1128, Short.MAX_VALUE)
        );
        rysujJPanelLayout.setVerticalGroup(
            rysujJPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );

        sortujJButton.setText("Sortuj");
        sortujJButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                sortujJButtonActionPerformed(evt);
            }
        });

        startJButton.setText("Start");
        startJButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                startJButtonActionPerformed(evt);
            }
        });

        zatrzymajJButton.setText("Zatrzymaj");
        zatrzymajJButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                zatrzymajJButtonActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout menuJPanelLayout = new javax.swing.GroupLayout(menuJPanel);
        menuJPanel.setLayout(menuJPanelLayout);
        menuJPanelLayout.setHorizontalGroup(
            menuJPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(zatrzymajJButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addComponent(sortujJButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addComponent(startJButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        menuJPanelLayout.setVerticalGroup(
            menuJPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(menuJPanelLayout.createSequentialGroup()
                .addGap(23, 23, 23)
                .addComponent(startJButton)
                .addGap(18, 18, 18)
                .addComponent(sortujJButton)
                .addGap(18, 18, 18)
                .addComponent(zatrzymajJButton)
                .addContainerGap(465, Short.MAX_VALUE))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(rysujJPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(menuJPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 81, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(rysujJPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addComponent(menuJPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>                        

    private void startJButtonActionPerformed(java.awt.event.ActionEvent evt) {                                             
        rysuj.zdarzenie=0;
        rysuj=new Rysuj();
        rysuj.setBackground(new Color(240,255,255));
        rysuj.setBounds(0, 0, 1200, 600);
        rysujJPanel.add(rysuj);
        rysuj.repaint();
    }                                            

    private void sortujJButtonActionPerformed(java.awt.event.ActionEvent evt) {                                              
        rysuj.zdarzenie=1;
        if(!w.isAlive()) w.start();
        rysuj.repaint();
    }                                             

    private void zatrzymajJButtonActionPerformed(java.awt.event.ActionEvent evt) {                                                 
        w.suspend();
        w = new Watek();
    }                                                

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Frame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Frame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Frame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Frame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Frame().setVisible(true);
            }
        });
    }
    
    public class Watek extends Thread {
        public void run() {
            rysuj.algorytm.babelkowe();
        }
    }
    
    // Variables declaration - do not modify                     
    private javax.swing.JPanel menuJPanel;
    private javax.swing.JPanel rysujJPanel;
    private javax.swing.JButton sortujJButton;
    private javax.swing.JButton startJButton;
    private javax.swing.JButton zatrzymajJButton;
    // End of variables declaration                   
}

rysuj.java

package frame;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JPanel;

public class Rysuj extends JPanel
{
    Algorytmy algorytm;
    int zdarzenie;
    public Rysuj()
    {
        algorytm=new Algorytmy(this);
    }          
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;        
        int x=-5,y=100,wys=0,szer=10;
        for(int i=0;i<algorytm.tab.length;i++)
        {
            g.setColor(Color.yellow);
            x=x+11;
            wys=algorytm.tab[i];
            g2d.fillRect(x,y,szer,wys);            
        }
        
        if(zdarzenie==1)
        {
            x=-5;
            g.setColor(Color.red);            
            wys=algorytm.tab[algorytm.getI()];
            x=(algorytm.getI())*11+5;
            g2d.fillRect(x,y,szer,wys); 
            
            g.setColor(Color.black);
            wys=algorytm.tab[algorytm.getI()+1]; // Tutaj chce rysować kolejny prostokąt, tyle tylko że jego wysokość jest za od razu max wartością z tablicy (chyba)
            x=(algorytm.getI()+1)*11+5;
            g2d.fillRect(x,y,szer,wys); 
        }
    }
}

algorytm.java

package frame;

import java.util.Random;
import javax.swing.JPanel;

public class Algorytmy
{
    int []tab;
    int k;
    JPanel panel;
    int dl=100;

    public Algorytmy(JPanel panel)
    {
        this.panel=panel;
        tab=new int[dl];
        Random rand = new Random(); 
        for(int i=0;i<tab.length;i++)
        {
            tab[i]=rand.nextInt(100);
            //tab[i]=i+101;
            System.out.print(tab[i]+" ");
        }
        System.out.print("\n");
    }
    
    public void babelkowe()
    {
        int temp;
        for(int j=0;j<tab.length;j++)
        {
            for(k=0;k<tab.length-1;k++)
            {   
                if (tab[k+1]<tab[k]) 
                {
                    temp=tab[k];            
                    tab[k]=tab[k+1];
                    tab[k+1]=temp;
                    panel.update(panel.getGraphics());
                    try 
                    {
			Thread.sleep(100);
                    }
                    catch(Exception e) 
                    {}
                }
                else
                {
                    panel.update(panel.getGraphics());
                }
            }
        }
        
        for(int i=0;i<tab.length;i++)
        {
            System.out.print(tab[i]+" ");
        }
        System.out.print("\n");
    }    
    public int getI()
    {
        return k;
    }
}

Jestem laikiem jeżeli chodzi o jave, dziękuje za każdą podpowiedź/pomoc.