We would like to know how to extend DefaultTableColumnModel.
/*w w w. java2 s. c o m*/ import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableColumnModel; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumn; public class Main extends JFrame { public Main() { setSize(300, 200); setDefaultCloseOperation(EXIT_ON_CLOSE); DefaultTableModel dtm = new DefaultTableModel(new String[][] { { "1", "2", "3" }, { "4", "5", "6" } }, new String[] { "Names", "In", "Order" }); SortingColumnModel scm = new SortingColumnModel(); JTable jt = new JTable(dtm, scm); jt.createDefaultColumnsFromModel(); JScrollPane jsp = new JScrollPane(jt); getContentPane().add(jsp, BorderLayout.CENTER); } public static void main(String args[]) { new Main().setVisible(true); } } class SortingColumnModel extends DefaultTableColumnModel { public void addColumn(TableColumn tc) { super.addColumn(tc); int newIndex = sortedIndexOf(tc); if (newIndex != tc.getModelIndex()) { moveColumn(tc.getModelIndex(), newIndex); } } protected int sortedIndexOf(TableColumn tc) { // just do a linear search for now int stop = getColumnCount(); String name = tc.getHeaderValue().toString(); for (int i = 0; i < stop; i++) { if (name.compareTo(getColumn(i).getHeaderValue().toString()) <= 0) { return i; } } return stop; } }