martes, 7 de octubre de 2008

Uso de JTable I - 1. Algo de teoria

Muchas veces he tenido que realizar algún software que use JTable y cuando ya pensaba que nada nuevo me iba a hacer falta aprender surgía alguna complicación y tenía que tratarla de forma especial, por lo que tenía que pasar algunas horas en google tratando de encontrar esa forma especial de trabajar con los problemas. Lo que pretendo con esta serie de post es compartir un poco las formas de usar un JTable de muchas diferentes maneras, aunque de seguro no son todas pero a medida que vaya aprendiendo cosas nuevas las voy a ir posteando.

Todos los ejemplos que presento han sido creados por mi para mostrar como trabaja la funcionalidad que intento mostrar, aunque el código no siempre va a ser totalmente mío, en la medida que pueda voy a citar la fuente pues el merito es de ellos, además, a veces ni se que es lo que hacen pero igual funciona jejeje. Después de todo, mientras funcione, solo modificamos lo que nos sirve J Los ejemplos fueron escritos usando NetBeans como IDE.

Espero que les sea útil.

Los temas a tratar en la serie de post son los siguientes:

  1. Algo de teoría.
  2. Introducir contenido al JTable.
  3. Seleccionar una fila del JTable.
  4. Limpiando el contenido del JTable.
  5. Establecer el tamaño de las columnas por defecto.
  6. Validar el contenido de los campos.
  7. Definir el número de columnas en tiempo de ejecución.
  8. Cualquier otra cosa que salga o consulta sobre el tema.
  1. ALGO DE TEORIA.

Con la clase JTable, se pueden mostrar tablas de datos, y opcionalmente permitir que el usuario los edite. JTable no contiene ni almacena datos; simplemente es una vista de nuestros datos.

Algunos de los constructores que emplea esta clase son los siguientes:

Ø  JTable()

o    Construye un JTable() predeterminado

Ø  JTable(int numRows, int numColumns)

o    Construye un JTable()con numRows y numColumns de celdas vacías, utilizando DefaultTableModel

Ø  JTable(Object[][] rowData, Object[] columnNames)

o    Construye un JTable() visualizando los valores de rowData en una matriz bidimencional, utilizando columnNames como nombres para las columnas

Ø  JTable(TableModel dm)

o    Construye un JTable() con dm como modelo de tabla, un modelo de columna predeterminado y un modelo de selección predeterminado

Ø  JTable(TableModel dm, TableColumnModel cm)

o    Construye un JTable() con dm como modelo de tabla, cm como modelo de columna y un modelo de selección predeterminado.

Ø  JTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm)

o    Construye un JTable() con dm como modelo de tabla, cm como modelo de columna y sm como modelo de selección.

Ø  JTable(Vector rowData, Vector columnNames)

o    Construye un JTable() para visualizar los valores del Vector de Vectores, rowData, con nombres de columnas dados en columnNames.

En el siguiente ejemplo, para crear un JTable se emplea el siguiente código

 

private javax.swing.JTable jTableDatos;

jTableDatos = new javax.swing.JTable(); // estamos usando el primer constructor de la lista.

 

Pero como había mencionado antes, la clase JTable solo muestra los datos. Para determinar que es lo que queremos mostrar tenemos que utilizar un TableModel.

 

El modelo de tabla o TableModel

Los modelos de tabla son objetos que implementan la interfase TableModel; a través de ellos es posible personalizar mucho más y mejor el comportamiento de los componentes JTable, permitiendo utilizar al máximo sus potencialidades. Todas las tablas cuentan con un modelo de tabla.

La clase AbstractTableModel es la que implementa directamente a la interfase TableModel, aunque es esta clase la que se recomienda extender para utilizarla como modelo de tabla, existe un modelo de tabla predeterminado que facilita mucho el trabajo con tablas. Este modelo predeterminado es la clase DefaultTableModel.

Sus constructores son los siguientes:

Ø  DefaultTableModel()

o    Construye un DefaultTableModel.

Ø  DefaultTableModel(int numRows, int numColumns)

o    Construye un DefaultTableModel con numRows y numColumns

Ø  DefaultTableModel(Object[][] data, Object[] columnNames)

o    Construye un DefaultTableModel e inicia la tabla pasando data y columnNames al método setDataVector()

Ø  DefaultTableModel(Object[] columnNames, int numRows)

o    Construye un DefaultTableModel con un número de columnas equivalentes al número de elementos o valores nulos en columnNames y numRows

Ø  DefaultTableModel(Vector columnNames, int numRows)

o    Construye un DefaultTableModel con un número de columnas equivalentes al número de elementos o valores nulos en columnNames y numRows.

Ø  DefaultTableModel(Vector data, Vector columNames)

o    Construye un DefaultTableModel e inicia la tabla pasando data y columnNames al método setDataVector()

 Para mas detalles ver el JavaDoc.

Si bien el modelo predeterminado DefaultTableModel nos facilita mucho el trabajo, no es el optimo dado que emplea demasiados recursos, sin embargo, para aplicaciones pequeñas funciona bastante bien. Mas adelante, en otro articulo sobre optimización de código Java voy a mostrar como mejor el rendimiento de los JTable.

 

En el ejemplo ya teníamos creado el JTable, ahora hay que agregarle el TableModel. Nuestro código queda así:

 

private javax.swing.JTable jTableDatos;

jTableDatos = new javax.swing.JTable(); // estamos usando el primer constructor de la lista.

jTableDatos.setModel(new javax.swing.table.DefaultTableModel(

            new Object [][]

            {

                        // no se agrega ninguna fila

            },

            new String []

            {

                "D.N.I", "Apellido", "Nombre"

            }

        )); // estamos usando el tercer constructor de la lista

 

Ahora ya tenemos creado la tabla con tres columnas (“D.N.I”, “Apellido” y “Nombre”) y ninguna fila, pero si al momento de llenar datos en la tabla, estos superan el tamaño del JTable (superan el numero de filas que el JTable esta mostrando), no podremos visualizarlos. Para ello necesitamos tener las barras de desplazamiento horizontal y vertical (JScrollPanel). Esto se consigue creando un JSCrollPanel y agregando a este el JTable que ya tenemos creado. Nuestro código queda de la siguiente manera:

 

jScrollPane1 = new javax.swing.JScrollPane();

jTableDatos = new javax.swing.JTable();

jTableDatos.setModel(new javax.swing.table.DefaultTableModel(

            new Object [][]

            {

 

            },

            new String []

            {

                "D.N.I", "Apellido", "Nombre"

            }

        ));

        jScrollPane1.setViewportView(jTableDatos);

 

Y listo, ya tenemos creado nuestra tabla con barras de desplazamiento horizontal y vertical.

 

Sin embargo, todo esto nos lo podemos ahorrar simplemente arrastrando el componente JTable de la lista de componentes del IDE NetBeans, pero siempre es bueno saber de donde es que vienen las cosas.

2 comentarios:

Pablo Benjamin dijo...

Muy bueno tu aporte, voy a hacerme un tiempo. Asi tambien colaboro.

Gracias por tu interes.

El Mazter dijo...

Esta bueno el tutorial.
Cuenten conmigo si necesitan algo...
El Mazter