FileDocCategorySizeDatePackage
TestSortableTableModel.javaAPI DocExample5163Mon Jan 09 11:01:58 GMT 2006None

TestSortableTableModel.java

import java.awt.*;
import java.awt.event.*;
import java.awt.color.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;
import java.util.*;

public class TestSortableTableModel extends JPanel 
    implements ActionListener {

    DefaultTableModel myModel;
    SortableTableModel mySortableModel;
    JButton sort1, sort2, sort3, bonus;

    static Object[] headers = {
        "Letter", "Number", "Color"
    };
    static Object[][] data = {
        {"A", new Integer(2), Color.gray.darker().darker()},
        {"B", new Integer (3), Color.gray},
        {"C", new Integer (1), Color.gray.darker()},
    };

    static Object[] bonusData = {
        // "D", "0", Color.red  // this is the (buggy) book version
        "D", new Integer(0), Color.red
    };

    public TestSortableTableModel (DefaultTableModel m) {
        super (new BorderLayout());
        myModel = m;
        mySortableModel = new SortableTableModel (myModel);
        mySortableModel.setComparatorForColumn (new MyColorComparator(), 2);
        JTable table = new JTable (mySortableModel);
        table.setDefaultRenderer (java.awt.Color.class, new ColorRenderer());
        JScrollPane scroller =
            new JScrollPane (table,
                             ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
                             ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
        table.setPreferredScrollableViewportSize (new Dimension (400, 200));
        setLayout(new BorderLayout());
        add (scroller, BorderLayout.CENTER);
        // add sort buttons
        JPanel buttonPanel = new JPanel();
        sort1 = new JButton ("Sort 1");
        buttonPanel.add(sort1);
        sort1.addActionListener(this);
        sort2 = new JButton ("Sort 2");
        buttonPanel.add(sort2);
        sort2.addActionListener(this);
        sort3 = new JButton ("Sort 3");
        buttonPanel.add(sort3);
        sort3.addActionListener(this);
        bonus = new JButton ("More data");
        buttonPanel.add(bonus);
        bonus.addActionListener(this);
        add (buttonPanel, BorderLayout.SOUTH);

    }

    public void actionPerformed (ActionEvent e) {
        if (e.getSource() == sort1) {
            mySortableModel.setSortColumn (0);
        } else if (e.getSource() == sort2) {
            mySortableModel.setSortColumn (1);
        } else if (e.getSource() == sort3) {
            mySortableModel.setSortColumn (2);
        } else if (e.getSource() == bonus) {
            myModel.addRow (bonusData);
        }


    }

    public static void main (String[] args) {
        DefaultTableModel aModel =
            new DefaultTableModel(data, headers) ;
        JFrame frame = new JFrame ("Sortable Table");
        frame.getContentPane().add (new TestSortableTableModel(aModel),
                                    BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);
    }


    class MyColorComparator implements Comparator {
        float[] hsb = new float[3];
        public int compare (Object o1, Object o2) {
            if ((! (o1 instanceof Color)) ||
                (! (o2 instanceof Color)))
                return 0;
            else {
                Color c1 = (Color) o1;
                Color c2 = (Color) o2;
                Color.RGBtoHSB ( c1.getRed(),
                                 c1.getGreen(),
                                 c1.getBlue(),
                                 hsb);
                float bright1 = hsb[2];
                Color.RGBtoHSB ( c2.getRed(),
                                 c2.getGreen(),
                                 c2.getBlue(),
                                 hsb);
                float bright2 = hsb[2];
                if (bright1 == bright2)
                    return 0;
                else
                    return ((bright1-bright2) < 0) ? -1 : 1;
            }
        }
        public boolean equals (Object obj) {
            return super.equals (obj);
        }
    }

    class ColorRenderer extends DefaultTableCellRenderer {
        public Component getTableCellRendererComponent (JTable table,
                                                        Object value,
                                                        boolean isSelected,
                                                        boolean hasFocus,
                                                        int row,
                                                        int col) {
            Component returnMe = 
                super.getTableCellRendererComponent (table, value,
                                                     isSelected,
                                                     hasFocus, row, col);

            // background only version
            
            if (value instanceof Color) {
                Color color = (Color) value;
                returnMe.setBackground (color);
                if (returnMe instanceof JLabel) {
                    JLabel jl = (JLabel) returnMe;
                    jl.setOpaque(true);
                    jl.setText ("");
                }
            }
            return returnMe;
        }

    }

}