注:本例为swing中JTable按时间字段排序,已封装好可直接调用,即使插入新数据在插入完毕后依然会做一次排序
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
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 {
private static final long serialVersionUID = 8217864808859107921L;
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 {
private static final long serialVersionUID = -6731071017470420963L;
DefaultTableModel model = new DefaultTableModel(new Object[][] { { "15:38:24", "1" }, { "15:18:44", "2" },
{ "12:31:24", "3" }, { "05:38:24", "4" }, { "20:38:24", "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();
tableSorted.setModel(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));
JButton btn = new JButton("增加");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
Object[] row_ = { "10:01:24", "3" };
model.addRow(row_);
}
});
panel.add(btn);
getContentPane().add(panel, BorderLayout.CENTER);
pack();
}
public static void main(String arg[]) {
new SortableTableModelAbstractTableModel().setVisible(true);
}
}