martes, 22 de abril de 2014

JTable y TableModel

JTable es uno de los componentes más complejos que tiene java ya que está basado en el patrón de diseño MVC, por ello en este apartado daremos exclusivamente a entender qué métodos requiere este componente para representar los datos al momento de crearse, gracias a un modelo de tabla prediseñado por nosotros. Cabe destacar que JTable solo se encarga de mostrar datos, más no gestionarlos.

JTable es un componente que requiere de una clase que implemente la interfaz TableModel para poder leer los datos que quiere mostrar. TableModel o también Modelo de Tabla, posee los métodos necesarios de los cuales hace uso un JTable para mostrar de manera correcta la información que va en cada celda de esta.

Los método descritos a continuación son del TableModel y serán interpretados por el JTable para mostrar los datos de la manera que queramos:
  • public int getColumnCount( ): Este método le dirá al JTable cuántas columnas tiene nuestra tabla por medio del valor entero que retorna.
  • public int getRowCount( ): Al igual que el método anterior este representa el número de filas de la tabla.
  • public Class<?> getColumnClass(int columnIndex): Este método puede resultar un tanto complicado, pero en simples palabras, cada columna de la tabla representa un tipo de dato, esto es, si por ejemplo tenemos las columnas que representen una "Cantidad", un "Nombre" y un "Precio"; bien sabemos que "cantidad" puede representar una clase Integer, "nombre" una campo de tipo String, y "precio" del tipo Double. Por ello el tipo de retorno de este método es del tipo Class que representa a dicha clase.
  • public String getColumnName(int columnIndex): Este método retorna el nombre que va a tener la cabecera de cada columna, pasándole como parámetro el indice de la columna, esto es empezando desde el 0.
  • public boolean isCellEditable(int rowIndex, int columnIndex): Permite decirle al JTable qué celdas son editables en base al índice de la fila y columna, retornando una valor boolean.
  • public Object getValueAt(int rowIndex, int columnIndex): Este es el método que JTable usa para obtener los datos que va a ir en cada celda de la tabla. Gracias a los métodos antes definidos como son getColumnCount( ) y getRowCount( ), JTable sabe con exactitud cuántas filas y columnas tendrá la tabla, por ende recorre tantas veces este método en base a estos valores para obtener dichos datos que serán mostrados en la tabla. Y con el método getColumnClass, convertirá dichos valores al tipo de dato que corresponden; hay que tener cuidado con este último ya que podría surgir una excepción en tiempo de ejecución.
  • public void setValueAt(Object aValue, int rowIndex, int columnIndex): Este método se encargá de asignar los datos al TableModel, según sea la celda correspondiente a la fila y columna que se ha modificado.
  • addTableModelListenerremoveTableModelListener: Estos dos últimos métodos son los encargados de notificar las modificaciones que ocurran en el TableModel. Su implementación puede ser un tanto difícil de hacerla.
Felizmente Java ya nos proporciona una clase que se encarga de implementar la mayoría de métodos que puedan sernos difícil de implementar, dejándonos a nosotros los métodos más importantes para representar nuestros datos. La clase se llama AbstractTableModel. Bastaría con extender esta clase y sobreescribir los métodos que solo son necesarios. La siguiente imagen muestra los métodos más elementales a implementar.




En este post vimos los elementos básicos necesarios para poder representar nuestros datos en un JTable, en base al manejo de estos, que es lo más importante al momento de usar este componente. En el siguiente post veremos con un ejemplo como usar el TableModel y asignarlo al JTable. Espero sus comentarios y sugerencias.. Gracias..

JTable de manera sencilla

Los JTable muchas veces pueden llegar a ser componentes bastantes complejos por la gran cantidad de métodos que posee y sobre todo cuando recién estamos aprendiendo a usarlos en nuestras aplicaciones. Por ello vamos a dar los primeros pasos para crear un JTable y cómo gestionar los datos a mostrar de manera transparente.

La manera más sencilla de crear un Jtable es utilizando cualquiera de los siguientes constructores:
  • JTable(Object[][] rowData, Object[] columnNames)
  • JTable(Vector rowData, Vector columnNames)

De esta forma especificamos de los datos a mostrar y el nombre de las columnas.

Los datos se los puede pasar directamente en el constructor como vimos anteriormente, pero de esta forma se nos resulta un poco difícil manejar datos si estos vienen de una base de datos. Por otra parte JTable es un componente que solo se encarga de mostrar datos ya que está basado en el patrón MVC, esto nos facilita la manera en que vamos a gestionar estos datos que aparentemente nos resulta confuso si por ejemplo tengo una lista de productos o personas y no sabemos cómo mostrar estos datos. Para ello JTable requiere de otra clase que se encarguen de gestionar estos, y así hacernos la vida más fácil.

JTable usa como modelo de datos a una clase que implemente la Interfaz TableModel, ya que esta interfaz proporciona el modelo de la distribución de los datos, o sea la manera de cómo JTable tiene que mostrar estos. Pero TableModel tiene métodos que talvés nosotros no entendamos como implementarlo, para esto Java ya nos proporciona una clase abstracta llamada AbstractTableModel que implementa los métodos mas complejos, dejándonos los métodos más básicos para que nosotros implementemos y así nuestro JTable no tenga errores.

Usaremos como ejemplo una lista de productos. Para ello requeriremos de lo siguiente:

  1. Definiremos una entidad Producto y posteriormente crearemos una lista de estos.
  2. Definiremos un Modelo de Tabla (lo mas importante), que gestionará nuestra lista de productos.
  3. A nuestro JTable le asignaremos este modelo de tabla.
  4. Mostraremos nuestra tabla.

Definimos una entidad Producto que representará cada fila de nuestra tabla. Esta entidad tendrá los siguientes campos: cantidad, nombre, precio y total.


Ahora iremos a los más importante que es la forma como vamos a gestionar nuestra lista de productos. Empezaremos por crear una clase llamada ModeloTablaProducto que herede de AbstractTableModel y nos obligará a implementar los métodos mas básicos.




  • El método getColumnCount( ), representará la cantidad de columnas que tendrá nuestra tabla.
  • El método getRowCount( ), representará la cantidad de filas que tendrá nuestra tabla, en este caso el número de productos.
  • El método getValueAt(int rowIndex, int columnIndex), como vemos retorna un objeto y representará el valor que tendrá cada celda del JTable. El JTable internamente en base al número de filas y columnas que obtuvo con los dos métodos anteriores, obtendrá cada valor de cada celda. Esto es: supongamos que definimos 4 columnas que representan los campos de la entidad producto, y tengamos 5 productos, quiere decir que con este método getValueAt( ), el JTable irá obteniendo cada valor de celda en base a las 4 columnas y 5 filas.


Existen otros métodos que bien podemos sobreescribir para darle mas funcionalidad a nuestra tabla como por ejemplo asignar el nombre de las columnas. Esto lo definimos sobreescribiendo el método getColumnName(int columnIndex). Donde columnIndex es el índice que representa la columna, esto es empezando por 0.

Ahora lo más importante, LOS DATOS; tenemos que definir una lista de productos, esto sería algo así..
Y pasando esta lista a nuestro modelo de tabla quedaría asi:



  • Como vemos, definimos el constructor pasando un lista de productos, los cuales son los datos a mostrar.
  • Definimos los nombres de las columnas en el campo columnas como un vector de String, y lo hacemos uso en el método getColumnCount( ) y getColumnName( ).
  • También definimos el número de filas de la tabla con el método getRowCount(), usando la tamaño de la lista de producto. Claro está comprobar si la lista es null, en tal caso quiere decir que la tabla no va a tener filas (0).
  • Y el método más importante de este Modelo de Tabla es getValueAt( ): Simplemente retornamos el valor correspondiente a cada celda de la tabla según sea el índice de la fila y columna basado en nuestra lista de productos. 

Finalmente faltaría crear nuestro JTable pasándole al constructor el Modelo de Tabla que definimos. Así quedaría finalmente nuestra tabla Productos.





Puedes descargar el proyecto completo desarrollado en Eclipse Espero sus comentarios y dudas que tengan al respecto.. Posteriormente publicaré más cosas sobre JTable. Gracias..