Created with colorer-take5 library. Type 'java'

import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;

public class BubbleSortDemo extends javax.swing.JApplet {
    // variables for sorting
    private int[] array;
    private int swap;
    private int index;
    private int index2;
    private boolean swapped;
    private boolean finished;
    
    // other variables
    private LineArray varray1;
    private IntArrayTableModel arrayTableModel;
    private boolean show_max=false;
    private boolean application=false;
    
    /** Initializes the applet BubbleSortDemo */
    public void init() {
        array=new int[20];
        
        arrayTableModel=new IntArrayTableModel();
        arrayTableModel.setArray(array);
        initComponents();
        
        varray1=new LineArray(array);
        demoArea.add(varray1);
        varray1.setBounds(20, 100, 480, 360);
        TableCellRenderer colorRenderer=new TableCellRenderer() {
            public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
                DefaultTableCellRenderer renderer=new DefaultTableCellRenderer();
                renderer.setHorizontalAlignment(JLabel.CENTER);
                Component component=renderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                if(row==index && !finished) {
                  component.setBackground(Color.red);
                  component.setForeground(Color.white);
                } else if(row>index2) {
                  component.setBackground(Color.blue);
                  component.setForeground(Color.white);
                } else {
                  component.setBackground(Color.white);
                  component.setForeground(Color.black);
                }
                return component;
            }
        };
        
        TableColumn i_column=varray3.getColumn("i");
        i_column.setCellRenderer(colorRenderer);
        i_column.setPreferredWidth(25);
        TableColumn value_column=varray3.getColumn("value");
        value_column.setCellRenderer(colorRenderer);
        
    }
    public void start() {
        initBubbleSort();
        if(!application) {
            String show_max_param=getParameter("show_maximum");
            String show_max_button_param=getParameter("show_maximum_button");
            if("0".equals(show_max_param) || "no".equals(show_max_param.toLowerCase())) {
                show_max=false;
            } else {
                show_max=true;
            }
            if("0".equals(show_max_button_param) || "no".equals(show_max_button_param.toLowerCase())) {
                //showMaxButton.setEnabled(false);
                jPanel1.remove(showMaxButton);
            } else {
                //showMaxButton.setEnabled(true);
                jPanel1.add(showMaxButton);
            }
        }
        display();
    }
    public void initBubbleSort() {
        initArray(100);
        index=0;
        index2=array.length-1;
        swapped=false;
        finished=false;
    }
    public void display() {
        indexField.setText(Integer.toString(index));
        index1Field.setText(Integer.toString(array[index]));
        index2Field.setText(Integer.toString(array[index+1]));
        swapField.setText(Integer.toString(swap));
        swappedField.setText(Boolean.toString(swapped));
        if(swapped) {
            swappedField.setForeground(Color.RED);
        } else {
            swappedField.setForeground(Color.BLUE);
        }
        statusField.setText(finished ? "Finished" : "Processing");
        varray1.setIndex(index,index2,finished,show_max);
        //varray2.setSelectedIndex(index);
        //varray3.
        if(array[index]>array[index+1]) {
            compareField.setText("arr[index]>arr[index+1], will swap");
            compareField.setForeground(Color.RED);
        } else {
            compareField.setText("arr[index]<=arr[index+1]");
            compareField.setForeground(Color.BLUE);
        }
        repaint();
    }
    protected void step() {
        if(!finished) {
            if(array[index]>array[index+1]) {
                swap=array[index];
                array[index]=array[index+1];
                array[index+1]=swap;
                swapped=true;
            }
            index++;
            if(index>=index2 || index2==1) {
                index2--;
                index=0;
                if(!swapped) {
                    finished=true;
                }
                swapped=false;
            }
        }
    }
    
    protected void initArray(int max) {
        for(int i=0;i<array.length;i++) {
            array[i]=(int)(Math.random()*max);
        }
    }
    
    /** This method is called from within the init() method to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    private void initComponents() {//GEN-BEGIN:initComponents
        Controls = new javax.swing.JPanel();
        test1Button = new javax.swing.JButton();
        demoArea = new javax.swing.JPanel();
        index1Field = new javax.swing.JTextField();
        index2Field = new javax.swing.JTextField();
        swapField = new javax.swing.JTextField();
        indexField = new javax.swing.JTextField();
        swappedField = new javax.swing.JTextField();
        statusField = new javax.swing.JTextField();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        compareField = new javax.swing.JTextField();
        jScrollPane2 = new javax.swing.JScrollPane();
        varray3 = new javax.swing.JTable();
        jPanel1 = new javax.swing.JPanel();
        initButton = new javax.swing.JButton();
        sortedButton = new javax.swing.JButton();
        backsortedButton = new javax.swing.JButton();
        outlanderGrtButton = new javax.swing.JButton();
        outlanderLessButton = new javax.swing.JButton();
        showMaxButton = new javax.swing.JButton();

        Controls.setBorder(new javax.swing.border.EtchedBorder());
        test1Button.setText("Step");
        test1Button.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                test1ButtonActionPerformed(evt);
            }
        });

        Controls.add(test1Button);

        getContentPane().add(Controls, java.awt.BorderLayout.NORTH);

        demoArea.setLayout(null);

        index1Field.setEditable(false);
        demoArea.add(index1Field);
        index1Field.setBounds(150, 40, 60, 20);

        index2Field.setEditable(false);
        demoArea.add(index2Field);
        index2Field.setBounds(150, 70, 60, 20);

        swapField.setEditable(false);
        demoArea.add(swapField);
        swapField.setBounds(360, 10, 50, 20);

        indexField.setEditable(false);
        demoArea.add(indexField);
        indexField.setBounds(150, 10, 60, 20);

        swappedField.setEditable(false);
        swappedField.setText("swapped");
        demoArea.add(swappedField);
        swappedField.setBounds(360, 40, 50, 20);

        statusField.setText("Processing");
        demoArea.add(statusField);
        statusField.setBounds(540, 0, 90, 20);

        jLabel1.setText("index:");
        demoArea.add(jLabel1);
        jLabel1.setBounds(10, 10, 50, 14);

        jLabel2.setText("Current ( arr[index] ):");
        demoArea.add(jLabel2);
        jLabel2.setBounds(10, 40, 130, 14);

        jLabel3.setText("Next ( arr[index+1] ):");
        demoArea.add(jLabel3);
        jLabel3.setBounds(10, 70, 130, 14);

        jLabel4.setText("swap:");
        demoArea.add(jLabel4);
        jLabel4.setBounds(290, 10, 40, 14);

        jLabel5.setText("swapped:");
        demoArea.add(jLabel5);
        jLabel5.setBounds(290, 40, 60, 14);

        compareField.setEditable(false);
        demoArea.add(compareField);
        compareField.setBounds(260, 70, 220, 20);

        varray3.setModel(arrayTableModel);
        jScrollPane2.setViewportView(varray3);

        demoArea.add(jScrollPane2);
        jScrollPane2.setBounds(520, 30, 70, 440);

        getContentPane().add(demoArea, java.awt.BorderLayout.CENTER);

        initButton.setText("Init");
        initButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                initButtonActionPerformed(evt);
            }
        });

        jPanel1.add(initButton);

        sortedButton.setText("Sorted");
        sortedButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                sortedButtonActionPerformed(evt);
            }
        });

        jPanel1.add(sortedButton);

        backsortedButton.setText("Backsorted");
        backsortedButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                backsortedButtonActionPerformed(evt);
            }
        });

        jPanel1.add(backsortedButton);

        outlanderGrtButton.setText("Outlander 1");
        outlanderGrtButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                outlanderGrtButtonActionPerformed(evt);
            }
        });

        jPanel1.add(outlanderGrtButton);

        outlanderLessButton.setText("Outlander 2");
        outlanderLessButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                outlanderLessButtonActionPerformed(evt);
            }
        });

        jPanel1.add(outlanderLessButton);

        showMaxButton.setText("Show Maximum");
        showMaxButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                showMaxButtonActionPerformed(evt);
            }
        });

        jPanel1.add(showMaxButton);

        getContentPane().add(jPanel1, java.awt.BorderLayout.SOUTH);

    }//GEN-END:initComponents

    private void showMaxButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_showMaxButtonActionPerformed
        show_max=!show_max;
        display();
    }//GEN-LAST:event_showMaxButtonActionPerformed

    private void outlanderLessButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_outlanderLessButtonActionPerformed
        initBubbleSort();
        java.util.Arrays.sort(array);
        array[array.length/2]=array[array.length/2]/2;
        display();
    }//GEN-LAST:event_outlanderLessButtonActionPerformed

    private void outlanderGrtButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_outlanderGrtButtonActionPerformed
        initBubbleSort();
        java.util.Arrays.sort(array);
        array[array.length/2]=array[array.length/2]*2;
        display();
    }//GEN-LAST:event_outlanderGrtButtonActionPerformed

    private void backsortedButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_backsortedButtonActionPerformed
        initBubbleSort();
        java.util.Arrays.sort(array);
        for(int i=0;i<array.length/2;i++) {
            int swap=array[i];
            array[i]=array[array.length-i-1];
            array[array.length-i-1]=swap;
        }
        display();
    }//GEN-LAST:event_backsortedButtonActionPerformed

    private void sortedButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_sortedButtonActionPerformed
        initBubbleSort();
        java.util.Arrays.sort(array);
        display();
    }//GEN-LAST:event_sortedButtonActionPerformed

    private void initButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_initButtonActionPerformed
        initBubbleSort();
        display();

    }//GEN-LAST:event_initButtonActionPerformed

    private void test1ButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_test1ButtonActionPerformed
        step();
        display();
    }//GEN-LAST:event_test1ButtonActionPerformed
    
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JPanel Controls;
    private javax.swing.JButton backsortedButton;
    private javax.swing.JTextField compareField;
    private javax.swing.JPanel demoArea;
    private javax.swing.JTextField index1Field;
    private javax.swing.JTextField index2Field;
    private javax.swing.JTextField indexField;
    private javax.swing.JButton initButton;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JButton outlanderGrtButton;
    private javax.swing.JButton outlanderLessButton;
    private javax.swing.JButton showMaxButton;
    private javax.swing.JButton sortedButton;
    private javax.swing.JTextField statusField;
    private javax.swing.JTextField swapField;
    private javax.swing.JTextField swappedField;
    private javax.swing.JButton test1Button;
    private javax.swing.JTable varray3;
    // End of variables declaration//GEN-END:variables
    
    
    public static void main(String args[]) {
        JFrame f=new JFrame("Bubble Sort Demo");
        f.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        BubbleSortDemo app=new BubbleSortDemo();
        app.application=true;
        //f.getContentPane().setLayout(new BorderLayout());
        f.getContentPane().add(app,BorderLayout.CENTER);
        f.setSize(800,600);
        app.init();
        app.start();
        f.show();
    }
}