Mega Code Archive

 
Categories / Java Tutorial / Swing
 

Sample Sorting Table Model

import java.awt.BorderLayout; import java.awt.GridLayout; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableModel; class SampleSortingTableModel extends AbstractTableModel implements TableModelListener {   protected TableModel base;   protected int sortColumn;   protected int[] row;   public SampleSortingTableModel(TableModel tm, int sortColumn) {     this.base = tm;     this.sortColumn = sortColumn;     tm.addTableModelListener(this);     rebuild();   }   public Class getColumnClass(int c) {     return base.getColumnClass(c);   }   public int getColumnCount() {     return base.getColumnCount();   }   public String getColumnName(int c) {     return base.getColumnName(c);   }   public int getRowCount() {     return base.getRowCount();   }   public Object getValueAt(int r, int c) {     return base.getValueAt(row[r], c);   }   public boolean isCellEditable(int r, int c) {     return base.isCellEditable(row[r], c);   }   public void setValueAt(Object value, int r, int c) {     base.setValueAt(value, row[r], c); // Notification will cause re-sort   }   public void tableChanged(TableModelEvent event) {     rebuild();   }   protected void rebuild() {     int size = base.getRowCount();     row = new int[size];     for (int i = 0; i < size; i++) {       row[i] = i;     }     sort();   }   protected void sort() { // Sort and notify listeners     for (int i = 1; i < row.length; i++) {       int j = i;       while (j > 0 && compare(j - 1, j) > 0) {         int temp = row[j];         row[j] = row[j - 1];         row[j - 1] = temp;         j--;       }     }     fireTableStructureChanged();   }   protected int compare(int i, int j) {     String s1 = base.getValueAt(row[i], sortColumn).toString();     String s2 = base.getValueAt(row[j], sortColumn).toString();     return s1.compareTo(s2);   } } public class SortableTableModelAbstractTableModel extends JFrame {   DefaultTableModel model = new DefaultTableModel(new Object[][] { { "this", "1" },       { "text", "2" }, { "will", "3" }, { "be", "4" }, { "sorted", "5" } }, new Object[] {       "Column 1", "Column 2" });   public SortableTableModelAbstractTableModel() {     setDefaultCloseOperation(EXIT_ON_CLOSE);     JTable tableOrig = new JTable(model);     tableOrig.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);     JTable tableSorted = new JTable(new SampleSortingTableModel(model, 0));     tableSorted.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);     JPanel panel = new JPanel(new GridLayout(1, 2));     panel.add(new JScrollPane(tableOrig));     panel.add(new JScrollPane(tableSorted));     getContentPane().add(panel, BorderLayout.CENTER);     pack();   }   public static void main(String arg[]) {     new SortableTableModelAbstractTableModel().setVisible(true);   } }