Para utilizar tablas en java se puede usar JTable, este se utiliza para mostrar y organizar cierta información en tablas; encargándose JTable de la parte gráfica, y TableModel de la parte lógica. Junto con estos se pueden utilizar varios componentes que complementan y mejoran la calidad de visualización y orden de la tabla.
JTable brinda mucha facilidad, ya que tiene la capacidad de crear desde tablas básicas y muy sencillas, hasta tablas de alta complejidad de información y estructura. [2]
LA FORMA MAS RAPIDA Y SENCILLA
Aparte de usar otros constructores que hay en JTable, una de lasformas más rápidas y sencillas de utilizar un JTable teniendo toda su funcionalidad, consiste en instanciar como modelo de datos un DefaultTableModel y luego un JTable , pasándole el modelo en el constructor. El código quedaría:
VAMOS A HACER NUESTRO PROPIO MODELO DE DATOS
El DefaultTableModel es un modelo genérico y puede no ser suficiente (o al menos, incómodo de usar) para nuestros propósitos.
Es bastante habitual el querer manejar la tabla como si fuera una lista, de forma que cada filacorresponde a una clase de datos y las columnas son los atributos de esaclase. Por ejemplo, queremos una lista de Persona y cada persona tiene unnombre, un apellido y una edad.
modelo.setValueAt (fila, columna, persona.nombre);columna++;modelo.setValueAt (fila, columna, persona.apellido);columna++;modelo.setValueAt (fila, columna, edad);
Por ello, a veces esmás cómodo implementar nuestros propios modelos de tabla. La cosa es fácil, únicamente debemos implementar la interfaceTableModel y luego poner además todos losmétodos que queramos, como el anhadePersona() o el damePersona() mencionados antes.
Una clase que implemente un TableModel debe redefinir los siguientes métodos:
class MiModelo implements TableModel{
public void addTableModelListener (TableModelListener l) {...}
public Class getColumnClass (int columIndex) {...}
public int getColumnCount() {...}
public String getColumnName (int columnIndex) {...}
public int getRowCount() {...}
public Object getValueAt (int rowIndex, int columnIndex) {...}
public boolean isCellEditable (int rowIndex, int columnIndex) {...}
public void removeTableModelListener (TableModelListener l) {...}
public void setValueAt (Object aValue, int rowIndex, int columnIndex)}
Hay básicamente tres tipos de métodos:
- Métodos para manejo de suscriptores al modelo. Un suscriptor es cualquier clase que quiera enterarse de cambios en los datos del modelo. El JTable es un ejemplo claro. El JTable se suscribe a cambios de datos en el modelo y de esta forma, en cuanto cambiemos datos en el modelo, el JTable se entera y se repinta automáticamente la pantalla. En este grupo están los métodos addTableModelListener() y removeTableModelListener()
- Métodos para menejo de datos. Permiten obtener y cambiar datos dentro de la tabla. Son los métodos getValueAt() y setValueAt().
El resto son métodos para obtener información de la tabla en sí misma, como número de filas, número de columnas, si una fila-columna es o no editable, nombre de la columna, etc. - Métodos para los suscriptores
Para implementar los métodos de los suscriptores necesitamos que nuestro modelo tenga una lista de suscriptores y únicamente hay que añadir o borrar suscriptores de esa lista. El código puede ser tan simple como esto:
Métodos para manejo de los datos
Para el manejo de datos, sólo tenemos dos métodos. El que pone un dato en una fila, columna y el que lo obtiene. Si seguimos con la idea de hacer una lista de personas, el código puede quedar como esto:
El método setValueAt() tiene una pequeña pega. Cualquier modificación que hagamos en los datos, debe ser notificada a los suscriptores. Debemos crear un TableModelEvent , rellenarlo con los datos adecuados y avisar a los suscriptores.
El TableModelEvent se puede rellenar con el constructor. Parael caso de setValueAt() debemos poner después de cambiar el dato (del switch) algo como esto
Se le pasan como parámetros:
- El modelo de datos que ha cambiado. En nuestro caso this.
- La fila inicial que ha cambiado.
- La fila final que ha cambiado, en nuestro caso la misma que la inicial, puesto que sólo ha cambiado una.
- La columna que ha cambiado.
Una vez creado el evento, hay que pasárselo a los suscriptores a través de su método tableChanged()
int i;
for (i=0; i Debemos hacer esto en todos los métodos que hagamos que cambien el modelo de datos, bien sea modificando datos, borrando o añadiendo filas o columnas. Los demás métodos Los demás métodos son de información general para la tabla y no tienen demasiado truco. Devolver el número de columnas. Para nuestro ejemplo de Persona, que tiene tres campos, devolveremos un 3. Devolver el nombre de las columnas. En nuestro ejemplo devolveremos "Nombre", "Apellido" y "Edad". Devolver cuántas filas hay (el número de elementos en nuestra lista de personas) public void anhadePersona (Persona nuevaPersona) { // Añade la persona al modelo datos.add (nuevaPersona); // Avisa a los suscriptores creando un TableModelEvent... TableModelEvent evento; evento = new TableModelEvent ( this, this.getRowCount()-1, this.getRowCount()-1, TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT); // ... y avisando a los suscriptores int i; for (i=0; i ((TableModelListener)suscriptores.get(i)).tableChanged(evento); } En este caso, en el evento, hemos puesto como fila la última, quees la recién añadida. Como columna hemos puesto TableModelEvent.ALL_COLUMNS que indica que todas las columnas se han visto afectadas. Finalmente, hay un nuevo parámetro que indica que la fila indicada se ha insertado. Si no ponemos nada en este parámetro (como en el caso del setValueAt()), indica que esos datos ya existían antes y que se han modificado. Y otro método para borrar una fila: public void borraPersona (int fila) { // Se borra la fila datos.remove(fila); // Y se avisa a los suscriptores, creando un TableModelEvent... TableModelEvent evento = new TableModelEvent (this, fila, fila, TableModelEvent.ALL_COLUMNS, TableModelEvent.DELETE); // ... y pasándoselo a los suscriptores int i; for (i=0; i } Nada especial que comentar. Se borra la fila que se indica, se crea el evento de forma similar al anterior, pero cambiando el último parámetro y se avisa a los suscriptores.[1] [2]http://www.gfc.edu.co/estudiantes/anuario/2003/sistemas/catalina/tercer_p/Tablas/c2.html
Devolver la clase de cada columna. Devolveremos String.class para el nombre y el apellido e Integer.class para la edad. Este método lo utiliza el JTable para saber como presentar o editar cada dato. Si el JTable no conoce la clase que le devolvemos (no es de las normales de java), lo más posible es que trate el dato como un Object y llame a su método toString() para pintarlo.
Devolver si una celda en fila, columna es o no editable, es decir, si el usuario puede escribir en ella y modificar los datos del modelo. En nuestro ejemplo devolveremos true .
Otros métodos
Puesto que para eso hemos hecho este modelo, vamos a añadirle un par de métodos que nos son útiles para el ejemplo y nos facilitan el añadir y borrar personas:
BIBLIOGRAFIA
[1] http://www.chuidiang.com/java/tablas/tablamodelo/tablamodelo.php
No hay comentarios:
Publicar un comentario