Swing JTable排序

注:本例为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);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值