Ordenar filas en un JTable ( RowSorter )

Cada vez estoy recibiendo más consultas acerca de cómo hacer que un JTable pueda ordenar las filas al hacer click en el nombre de una columna, que es como se suelen comportar todas las tablas.

Vamos a poner un ejemplo sencillo para que sea más claro, pero el método es el mismo sin importar la cantidad de datos que tenga la tabla. Imaginemos que estamos construyendo una tabla que tendrá los enlaces de este blog. Lo primero sería crear una estructura de datos con el nombre de las columnas y otra con los datos de las filas. Por simplicidad usaré arrays en ambos casos:

private void populateColumnNames() {
	columnNames = new String[] { "Nombre blog", "Dirección", "Autor" };
}
private void populateTableData() {
	data = new Object[4][3];
	data[0][0] = "Core dumped";
	data[0][1] = "http://m3drano.es/";
	data[0][2] = "Ramón Medrano";
	data[1][0] = "Miguel Fernández";
	data[1][1] = "http://www.miguelfernandez.info/";
	data[1][2] = "Miguel Fernández";
	data[2][0] = "Informático en apuros";
	data[2][1] = "http://diegosuarezgarcia.es/blog/";
	data[2][2] = "Diego Suárez García";
	data[3][0] = "Un blog de Silverlight";
	data[3][1] = "http://geeks.ms/blogs/eecsaky/";
	data[3][2] = "Eugénio Estrada";
}

Ahora deberíamos crear un JTable que use esos datos. El procedimiento “normal”, suponiendo que tengamos un método que se encargue de devolvernos la tabla creada, sería este:

private JTable getJTable() {
	if (table == null)
		table = new JTable(data,columnNames);
	return table;
}

Sin embargo, para conseguir una ordenación tendremos que separar explícitamente la tabla de su contenido y decir que queremos ordenación:

private JTable getJTable() {
	if (table == null) {
		table = new JTable();
		// Creamos el modelo, la parte que contenrá los datos de la tabla
		DefaultTableModel model = new DefaultTableModel();
		// Creamos un ordenador de filas para el modelo
		TableRowSorter sorter = new TableRowSorter(
				model);
		// Añadimos al modelo los datos que queremos que contenga la tabla
		model.setDataVector(data, columnNames);
		// Le decimos a la tabla que use el modelo de datos que hemos creado
		table.setModel(model);
		// Le decimos a la tabla que use la ordenación de filas que hemos
		// creado
		table.setRowSorter(sorter);
	}
	return table;
}

Con eso ya podemos hacer click en las columnas y estas ordenaran las filas como esperábamos :)

About the Author

Me llamo Pablo Carballude González, soy graduado en computación con master en HCI y Seguridad Informática. Actualmente trabajo para Amazon en Seattle como Software Developer Engineer. Soy de esas personas que no saben si los textos autobiográficos deben ser en primera o tercera persona. Lo intenté en segunda, pero no le entendí nada :P