jueves, 4 de octubre de 2012

Cómo agregar y eliminar filas de un JTable de Java

En muchas ocasiones nos encontramos con la necesidad de aumentar, agregar, insertar o adicionar filas; así como también disminuir, quitar, remover, borrar o eliminar filas de un JTable en tiempo de ejecución.

Para realizar ésas tareas podemos echar mano de la clase DefaultTableModel, la cual nos provee de un método llamado addRow que requiere de un solo parámetro: rowData; el cual no es más que un array o arreglo de Objects, ése mismo parámetro también puede ser un objeto de la clase Vector, pero para éste ejemplo utilizaremos un array de Objects (Object[]). Éste array de Objects vendría a ser como la fila que queremos adicionar al final de la tabla, donde cada elemento del arreglo vendría a contener un campo del registro o fila a ser adicionado.

DefaultTableModel también tiene el método insertRow, el cual necesita de dos parámetros: row y rowData; el parámetro row es un entero (int) que indica el índice de la fila de la tabla en la cual se desea insertar la nueva fila. Mientras que rowData, como dijimos anteriormente puede ser un arreglo de Objects (Object[]) o un Vector, el cual representa la nueva fila a insertarse.


Un método que nos puede ser bastante útil de la clase DefaultTableModel es removeRow, el cual requiere de de un sólo parámetro: row, el cual es un entero (int) que indica el índice de la fila que se desea eliminar de la tabla.

A efectos de ejemplificar el uso de éstos métodos, usaremos un ejemplo que consistirá en una tabla (un JTable que llamaremos "miTabla") que contendrá 4 columnas (Registro, Alumno, Materia y Nota) con 4 filas llenadas como se ve en la Figura 1, además contaremos con 4 botones, uno que llamaremos "btnAdd" (+), otro que llamaremos "btnRem" (-), además de "btnInsertar" (Insertar) y "btnEliminar" (Eliminar).

Figura 1.- Una tabla dinámica en Java que permite adicionar y/o eliminar filas en tiempo de ejecución.

Una breve explicación sobre la funcionalidad de cada uno de éstos botones y el código que va dentro de ellos se realiza a continuación.

El código que va dentro del botón "+" (btnAdd) es el siguiente:
private void btnAddActionPerformed(java.awt.event.ActionEvent evt) {                                       
     DefaultTableModel miTableModel = (DefaultTableModel) miTabla.getModel();
     Object nuevaFila[]= {"","",""};
     miTableModel.addRow(nuevaFila);
}

El anterior código lo único que hace es adicionar una fila "vacía" (línea de código 3) al final de la tabla (línea de código 4), para que el usuario pueda ingresar los datos correspondientes. Observar que en la línea de código 2 se obtiene un objeto de la clase DefaultTableModel (que llamamos "miTableModel") gracias al método getModel del JTable "miTabla";  ahora como JTable trabaja bajo una arquitectura llamda MVC (Modelo Vista Controlador), donde el DefaultTableModel ("miTableModel" para este ejemplo) es el Modelo, el JTable ("miTabla" para este ejemplo) es la Vista y los eventos que trabajan en el JTable es el Controlador, cada vez que hagamos cambios en el DefaultTableModel (a través de "miTableModel") como adicionar filas, eliminar filas, adicionar columnas, eliminar columnas, etc, etc, etc, éstos cambios se reflejarán automáticamente en la Vista, ósea en la parte visual de la tabla (la interfaz gráfica del JTable propiamente dicho).

Ahora analicemos el código que se ejecuta al presionar el botón "-" (btnRem), que es el siguiente:
private void btnRemActionPerformed(java.awt.event.ActionEvent evt) {                                       
     DefaultTableModel miTableModel = (DefaultTableModel) miTabla.getModel();
     if (miTableModel.getRowCount() > 0)
          miTableModel.removeRow(miTableModel.getRowCount()-1);
}

Éste código simplemente elimina la última fila de la tabla (línea de código 4), verificando previamente (línea de código 3) que al menos exista alguna fila en la tabla para ser eliminada, note que el método predefinido getRowCount devuelve el número de filas de la tabla.

Ahora el código que va dentro del botón "Insertar" (btnInsertar) sería el siguiente:
private void btnInsetarActionPerformed(java.awt.event.ActionEvent evt) {                                           
     DefaultTableModel miTableModel = (DefaultTableModel) miTabla.getModel();
     Object nuevaFila[]= {"","",""};
     int indFil = miTabla.getSelectedRow();
     if (indFil >= 0)
          miTableModel.insertRow(indFil, nuevaFila);
}

El código anterior inserta una fila en la ubicación que le indicamos con el puntero del mouse sobre alguna fila de la tabla o con las teclas "arriba" (up) o "abajo" (down), por ejemplo si seleccionamos la 3ra fila (ósea la fila 2, ya que las filas en un JTable van de 0...NroFilas - 1), se aumentará una fila "vacía" en esa posición y la que estaba antes ahí se desplazará una vez hacia abajo. Si no hay ninguna fila seleccionada no se inserta nada. Para ésto utilizamos el método getSelectedRow, el cual devuelve el índice de la fila que actualmente está seleccionada en la tabla, si no hay ninguna fila seleccionada devuelve -1; por eso antes de insertar una nueva fila en la tabla (línea de código 6), verificamos que exista una fila seleccionada en la misma (línea de código 5).

El código que va dentro del botón "Eliminar" (btnEliminar) sería:
private void btnEliminarActionPerformed(java.awt.event.ActionEvent evt) {                                            
     DefaultTableModel miTableModel = (DefaultTableModel) miTabla.getModel();
     int indFil = miTabla.getSelectedRow();
     if (indFil >= 0)
          miTableModel.removeRow(indFil);
}

Con éste código lo que se consigue es eliminar la fila que esté actualmente seleccionada, ya sea con el puntero del ratón o con las teclas "arriba" (up) o "abajo" (down) del teclado.

Vale la pena mencionar que a efectos prácticos en vez de obtener en cada ejecución de los botones el DefaultTableModel ("miTableModel"), mejor sería tenerlo como una atributo de clase y obtener el DefaultTableModel de la tabla en el constructor del formulario o directamente en la declaración del atributo y así en el código que va dentro de los botones hacer uso directamente de los métodos de ese objeto declarado como atributo de clase.

Al final del post dejo el código fuente para que puedas descargarlo y practicar, este proyecto fue programado ayudado con el editor Netbeans, de todos modos en la carpeta dist del proyecto tienen el un archivo ejecutable .jar para que puedan probar el programa directamente sin el IDE.

De seguro todos o algunos de estos códigos en algún momento dado, probablemente previa adaptación, te servirán de ejemplo para aplicarlos en futuros proyectos. Bonito el ejemplito, ¿verdad?

P.D.- No se olviden de calificar el post por favor.

Códifo Fuente: descargar/download

6 comentarios :

Encuesta: ¿Quién es el mejor catedrático de la carrera de Ing. Informática de la UAGRM?