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 TableRowSortersorter = 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 :)
y cómo hago si por ejemplo quisiera que los datos me aparecieran ordenados (por defecto) por «Nombre blog»?
Has encontrado la manera de hacer que se ordene por defecto por un campo concreto?
Saludos
Muchas gracias, su publicación me ha ayudado muchísimo.
La pregunta va si se puede obterner el ordenamiento original con el que cargas el JTable … antes de ordenarlo ascendentemente o descendentemente.