Jtable de Java
Jtable de Java
Jtable de Java
Introduccion
Con la llegada de Swing, como parte de la JFC(Java Foundation Classes), la construccin de Interfaces Grficas de Usuario(GUI) recibi un excelente conjunto de componentes (aproximadamente 40)que la mejoraron: desde el siempre utilizado JButton, hasta el flexible JEditorPane o el JDesktopPane, pasando por los JTree y los JTable; sin dejar de mencionar a los JFilechooser y los JDialog, todos ellos, y los componentes restantes, permiten la creacin de aplicaciones con interfaces grficas ms intuitivas y completas. Swing es el resultado de la unin de esfuerzos entre Netscape, con su Internet Foundation Classes, y SUN. Swing es slo una parte de la JFC, muchos cometemos el error de creer que Swing y JFC son lo mismo. La JFC contiene tambin otros elementos, estos son algunos de ellos: Cortar y Pegar Elementos de Accesibilidad Java 2D Impresin
De todos los componentes que forman Swing, quiz los JTree y las JTable, sean los componentes con APIs ms extensas (la clase JTable tiene ms de 100 mtodos), y quiza tambin los ms complejos. 1 de 27
http://www.javahispano.org Afortunadamente esa complejidad les permite ser tambin de los componentes Swing ms personalizables y potentes; al igual que en la mayora de las otras clases Swing no es necesario conocer todos sus mtodos para comenzar a utilizarlos y darles una utilidad prctica. Como programadores, sabemos muy bien que la presentacion de datos tabulados es una de las tareas ms comunes que se presentan al momento de crear interfaces grficas; desde la simple tabla que permite nicamente mostrar el resultado de una consulta, hasta las que permiten editar directamente el contenido de cada celda, ordenar las columnas, personalizar su apariencia, etc. Todas las tareas antes descritas, y muchas otras, son posibles de realizar utilizando la clase JTable; por supuesto, mientras ms complejo sea el requerimiento a cubrir, se requerir en igual medida utilizar ms mtodos o recursos de la clase. Este primer artculo: Muestra como crear una JTable sencilla para la visualizacion de datos. Explica que es un modelo de tabla Muestra como crear una JTable con DefaultTableModel como modelo de tabla Muestra como crear una JTable con AbstractTableModel como modelo de tabla Describe la API JTable Describe la API DefaultTableModel Describe la API AbstractTableModel
Un Ejemplo Sencillo El ttulo de este artculo es: JTable con ejemplos; asi que comenzaremos creando una tabla sencilla. Esta tabla nicamente mostrar un conjunto de datos definidos desde su constructor, para ello primero daremos una vistazo rpido a los constructores que proporciona esta clase; puedes ver al final del artculo con detalle ms informacin. JTable() JTable(int numRows, int numColumns) JTable(Object[][] rowData, Object[] columnNames) JTable(TableModel dm) JTable(TableModel dm, TableColumnModel cm) JTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm) JTable(Vector rowData, Vector columnNames)
Para este primer ejemplo utilizaremos el 3er. constructor de la lista anterior. El cual nos permite construir una tabla a partir de dos parmetros; el primero de ellos: rowData es un array bidimencional de objetos que representa el contenido de la tabla, y el segundo: columnNames representa los nombres de cada columna, contenidos tambin en un array que por lo general es un array de String's. Nuestro primer ejemplo tendra las siguientes columnas:
String[] columnNames =
2 de 27
Jtable (parte 1)
{"Nombre", "Apellido", "Pasatiempo", "Aos de Practica", "Soltero(a)"};
public class SimpleTable1 extends JFrame { public SimpleTable1() { super("Ejemplo 1"); //array bidimencional de objetos con los datos de la tabla Object[][] data = { {"Mary", "Campione", "Esquiar", new Integer(5), new Boolean(false)}, {"Lhucas", "Huml", "Patinar", new Integer(3), new Boolean(true)}, {"Kathya", "Walrath", "Escalar", new Integer(2), new Boolean(false)}, {"Marcus", "Andrews", "Correr", new Integer(7), new Boolean(true)}, {"Angela", "Lalth", "Nadar", new Integer(4), new Boolean(false)} }; //array de String's con los ttulos de las columnas String[] columnNames = {"Nombre", "Apellido", "Pasatiempo", "Aos de Practica", "Soltero(a)"}; //se crea la Tabla final JTable table = new JTable(data, columnNames); table.setPreferredScrollableViewportSize(new Dimension(500, 70)); //Creamos un JscrollPane y le agregamos la JTable JScrollPane scrollPane = new JScrollPane(table); //Agregamos el JScrollPane al contenedor getContentPane().add(scrollPane, BorderLayout.CENTER); //manejamos la salida
3 de 27
http://www.javahispano.org
addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public static void main(String[] args) { SimpleTable1 frame = new SimpleTable1(); frame.pack(); frame.setVisible(true); } }
Figura 1. SimpleTable1 en ejecucin En lugar de arrays pudimos haber utizado vectores y utilizado el ultimo de los constructores de la lista mostrada anteriormente. Aunque la maner ms sencilla de construir tablas es utilizando cualquiera de los siguientes constructores: JTable(Object[][] rowData, Object[] columnNames) JTable(Vector rowData, Vector columnNames)
Su utilizacin presenta unas desventajas que debemos tener en cuenta: La primera, y ms notoria de ellas, es que para la construccion de la tabla se tienen que tener de antemano los datos que queremos que contenga la tabla ya sea en un array o en un vector, lo que le resta flexibilidad al llenado de la tabla; ya que quizs en un momento dado, sera mucho ms prctico y rpido, colocar directamente los datos en la tabla y no tener que colocarlos antes en un array o vector La segunda desventaja es que, como te dars cuenta al probar el ejemplo, estos constructores hacen automticamente que todas las celdas sean editables. Y la tercera, y menos notoria a primera vista, es que todos los datos contenidos en la tabla, son tratados como de un mismo tipo de datos. A pesar de que hemos declarado columnas como Boolean o Integer, todas nuestas celdas muestran su contenido como String's
Estas tres desventajas pueden ser eliminadas si agregamos un modelo de tabla a nuestra aplicacion.
4 de 27
Jtable (parte 1) El Modelo de Tabla Los modelos de tabla son objetos que implementan la interface TableModel; a travs de ellos es posible personalizar mucho ms y mejor el comportamiento de los componentes JTable, permitiendo utilizar al mximo sus potencialidades. Todas las tablas cuentan con un modelo de tabla , aunque en el ejemplo 1 no se haya especificado, existe uno por omisin El siguiente grfico intenta mostrar como cada componente JTable obtiene siempre sus datos desde un modelo de tabla .
Figura 2. Relacin Modelo -> Vista La clase AbstractTableModel es la que implementa directamente a la interface 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
DefaultTableModel
Nuevamente, antes de comenzar a utilizar esta clase, veremos cuales son los constructores con que cuenta: DefaultTableModel() DefaultTableModel(int numRows, int numColumns) DefaultTableModel(Object[][] data, Object[] columnNames) DefaultTableModel(Object[] columnNames, int numRows) DefaultTableModel(Vector columnNames, int numRows) DefaultTableModel(Vector data, Vector columNames)
Utilizaremos el constructor que nos permite crear un DefaultTableModel, a partir de los datos 5 de 27
Despues de haber creado el modelo de tabla, dtm en el ejemplo , se crea la tabla con el constructor correspondiente:
final JTable table = new JTable(dtm);
Una vez hecho esto, cualquier modificacin que se realice sobre el modelo de tabla se reflejar directamente en la tabla. As, podemos agregar una columna:
String[] newColumn= {"Flan", "Pastel", "Helado", "Barquillo" "Manzana" }; dtm.addColumn("Postre",newColumn);
una fila:
Object[] newRow={"Pepe", "Grillo", "Tenis", new Integer(5), new Boolean(false), "Pera"}; dtm.addRow(newRow);
o modificar una celda en especial, en este ejemplo la celda ubicada en la columna 1, fila 1:
dtm.setValueAt("Catherine", 1, 1);
Puedes revisar los mtodos que proporciona la clase DefaultTableModel para conocer que otras cosas puedes realizar con ella. A continuacin se presenta el listado completo del cdigo que muestra el uso del modelo de tabla 6 de 27
public class SimpleTable2 extends JFrame { public SimpleTable2() { super("Ejemplo 2"); //array bidimencional de objetos con los datos de la tabla Object[][] data = { {"Mary", "Campione", "Esquiar", new Integer(5), new Boolean(false)}, {"Lhucas", "Huml", "Patinar", new Integer(3), new Boolean(true)}, {"Kathya", "Walrath", "Escalar", new Integer(2), new Boolean(false)}, {"Marcus", "Andrews", "Correr", new Integer(7), new Boolean(true)}, {"Angela", "Lalth", "Nadar", new Integer(4), new Boolean(false)} }; //array de String's con los ttulos de las columnas String[] columnNames = {"Nombre", "Apellido", "Pasatiempo", "Aos de Practica", "Soltero(a)"}; //creamos el Modelo de la tabla con los datos anteriores DefaultTableModel dtm= new DefaultTableModel(data, columnNames); //se crea la Tabla con el modelo DefaultTableModel final JTable table = new JTable(dtm); // una vez creada la tabla con su modelo // podemos agregar columnas String[] newColumn= {"Flan", "Pastel", "Helado", "Barquillo" "Manzana" }; dtm.addColumn("Postre",newColumn); //filas Object[] newRow={"Pepe", "Grillo", "Tenis", new Integer(5), new Boolean(false), "Pera"}; dtm.addRow(newRow); //o modificar una celda en especifico dtm.setValueAt("Catherine", 1, 1); //se define el tamao table.setPreferredScrollableViewportSize(new Dimension(500, 70));
7 de 27
http://www.javahispano.org
//Creamos un JscrollPane y le agregamos la JTable JScrollPane scrollPane = new JScrollPane(table); //Agregamos el JScrollPane al contenedor getContentPane().add(scrollPane, BorderLayout.CENTER); //manejamos la salida addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public static void main(String[] args) { SimpleTable2 frame = new SimpleTable2(); frame.pack(); frame.setVisible(true); } }
public class SimpleTable3 extends JFrame { public SimpleTable3() { super("Ejemplo 3"); //creamos el arreglo de objetos que contendra el //contenido de las columnas Object[] data = new Object[5]; // creamos el modelo de Tabla
8 de 27
Jtable (parte 1)
DefaultTableModel dtm= new DefaultTableModel(); // se crea la Tabla con el modelo DefaultTableModel final JTable table = new JTable(dtm); // insertamos las columnas for(int column = 0; column < 5; column++){ dtm.addColumn("Columna " + column); } // insertamos el contenido de las columnas for(int row = 0; row < 10; row++) { for(int column = 0; column < 5; column++) { data[column] = "Celda " + row + "," + column; } dtm.addRow(data); } //se define el tamao table.setPreferredScrollableViewportSize(new Dimension(500, 70)); //Creamos un JscrollPane y le agregamos la JTable JScrollPane scrollPane = new JScrollPane(table); //Agregamos el JScrollPane al contenedor getContentPane().add(scrollPane, BorderLayout.CENTER); //manejamos la salida addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public static void main(String[] args) { SimpleTable3 frame = new SimpleTable3(); frame.pack(); frame.setVisible(true); } }
En este segundo ejemplo del uso de la clase DefaultTableModel, creamos primeramente un array de objetos llamado data que podr contener 5 elementos.
Object[] data = new Object[5];
Antes de cualquier operacion sobre el modelo de tabla, debemos crear la tabla que lo utilizar:
final JTable table = new JTable(dtm);
9 de 27
http://www.javahispano.org
dtm.addColumn("Columna " + column); }
En el fragmento de cdigo anterior, en lugar de hacer una sencilla asignacin de valores consecutivos a cada celda dentro del ciclo for, podras estar leyendo y asignando directamente el contenido de: un archivo de texto, una consulta a una base de datos, o alguna otra fuente; ya que, como hemos visto, tambin es posible agregar filas completas a la tabla. La siguiente figura muestra el resultado de ejecutar el Ejemplo 3.
Figura 4. SimpleTable3 en ejecucin Como te podrs dar cuenta, al ejecutar los ejemplos 2 y 3, una de las desventajas de no manejar de manera directa un modelo de tabla a sido superada; ya es posible agregar directamente valores a las celdas de la tabla. Sin embargo, las celdas siguen siendo editables, y sus valores siguen siendo tratados an como String's. Cuando utilices el modelo de tabla DefaultTableModel debes tener en cuenta que: ste utiliza un vector de vectores para almacenar los valores de las celdas de la tabla, tiene un desempeo inferior al de un modelo de tabla personalizado, debido a que sus mtodos estan sincronizados y que adems en la documentacin oficial, se menciona que la serializacin de objetos que realiza esta clase no ser compatible con entregas futuras de Swing As, aunque la utilizacin del modelo de tabla DefaultTableModel es an funcional y proporciona facilidades para la utilizacion de un modelo de tabla, es mucho ms recomendable, por cuestiones de desempeo y personalizacin, utilizar la clase AbstractTableModel
AbstractTableModel
Con esta clase es posible implementar, de una manera ms completa y eficiente, los mtodos necesarios para crear un modelo de tabla.
10 de 27
Jtable (parte 1) Para crear un modelo de tabla personalizado, lo primero que necesitamos es extender la clase AbstractTableModel.
class MyTableModel extends AbstractTableModel { ..... }
Con la implementacin de los mtodos anteriores, las celdas de la tabla NO sern editables y NO se podrn modificar los valores de cada una de ellas. Si deseamos tener un mecanismo para modificar los valores de las celdas de la tabla, tenemos que sobrescribir el mtodo setValueAt de la clase AbstractTableModel:
class MyTableModel extends AbstractTableModel { public int getRowCount(){ ... } public int getColumnCount(){ ... } public Object getValueAt(int row, int column){ ... } public void setValueAt(Object value, int row, int col) { ... } }
Y, si la modificacin de los valores de las celdas, se hace directamente sobre ellas, necesitamos indicar a nuestro modelo de tabla que las celdas de la tabla sern editables, esto se hace sobrescribiendo el mtodo isCellEditable:
class MyTableModel extends AbstractTableModel { public int getRowCount(){ ... }
11 de 27
http://www.javahispano.org
public int getColumnCount(){ ... } public Object getValueAt(int row, int column){ ... } public void setValueAt(Object value, int row, int col){ ... } public boolean isCellEditable(int row, int col) { ... } }
Ms adelante puedes revisar los mtodos restantes que proporciona la clase AbstractTableModel Ya lo nico que hara falta sera agregar los nombres de las columnas de nuestra tabla y definir su contenido inicial:
class MyTableModel extends AbstractTableModel { final String[] columnNames = { ... } final Object[][] data = { ... } public int getRowCount(){ ... } public int getColumnCount(){ ... } public Object getValueAt(int row, int column){ ... } public void setValueAt(Object value, int row, int col){ ... } public boolean isCellEditable(int row, int col) { ... } }
JTable invoca un mtodo del modelo de tabla para determinar el editor/renderer predeterminado que utilizar para mostrar el valor de cada celda. Por ejemplo para celdas con valores booleanos utilizar check box's; este mtodo es: getColumnClass, y tambin es recomendable implementarlo: 12 de 27
Jtable (parte 1)
class MyTableModel extends AbstractTableModel { final String[] columnNames = { ... } final Object[][] data = { ... } public int getRowCount(){ ... } public int getColumnCount(){ ... } public Object getValueAt(int row, int column){ ... } public void setValueAt(Object value, int row, int col){ ... } public boolean isCellEditable(int row, int col) { ... } public Class getColumnClass(int c) { ... } }
Ahora, despues de saber cuales son los mtodos que se necesitan implementar y sobrescribir de la clase AbstractTableModel para crear nuestro propio modelo de tabla; veremos un ejemplo que nos muestra ya completa la definicion de la clase:
class MyTableModel extends AbstractTableModel { final String[] columnNames = {"Nombre", "Apellido", "Pasatiempo", "Aos de Practica", "Soltero(a)"}; final Object[][] data = { {"Mary", "Campione", "Esquiar", new Integer(5), new Boolean(false)}, {"Lhucas", "Huml", "Patinar", new Integer(3), new Boolean(true)}, {"Kathya", "Walrath", "Escalar", new Integer(2), new Boolean(false)}, {"Marcus", "Andrews", "Correr", new Integer(7), new Boolean(true)}, {"Angela", "Lalth", "Nadar", new Integer(4), new Boolean(false)} }; //nicamente retornamos el numero de elementos del //array de los nombres de las columnas public int getColumnCount() {
13 de 27
http://www.javahispano.org
return columnNames.length; } //retormanos el numero de elementos //del array de datos public int getRowCount() { return data.length; } //retornamos el elemento indicado public String getColumnName(int col) { return columnNames[col]; } //y lo mismo para las celdas public Object getValueAt(int row, int col) { return data[row][col]; } /* * Este metodo sirve para determinar el editor predeterminado * para cada columna de celdas */ public Class getColumnClass(int c) { return getValueAt(0, c).getClass(); } /* * No tienes que implementar este mtodo a menos que * las celdas de tu tabla sean Editables */ public boolean isCellEditable(int row, int col) { return true; } /* * No tienes que implementar este mtodo a menos que * los datos de tu tabla cambien */ public void setValueAt(Object value, int row, int col) { data[row][col] = value; fireTableCellUpdated(row, col); } }
Si estas utilizando una versin del JDK anterior a la 1.3, debes hacer las siguentes modificaciones al mtodo setValueAt, ya que antes de esta version era necesario crear manualmente un Integer a partir del valor recibido, ya que de otra manera, el valor recibido se seguira convirtiendo a un String, a partir de la Ver. 1.3, la conversion a Intenger es automtica.
//Version del metodo setValuAt para JDK's anteriores a la Ver.1.3 public void setValueAt(Object value, int row, int col) { if (data[0][col] instanceof Integer && !(value instanceof Integer)) { try { data[row][col] = new Integer(value.toString()); fireTableCellUpdated(row, col); } catch (NumberFormatException e) {
14 de 27
Jtable (parte 1)
JOptionPane.showMessageDialog(SimpleTable4.this, "The \"" + getColumnName(col) + "\" column accepts only integer values."); } } else { data[row][col] = value; fireTableCellUpdated(row, col); } }
Nota: Observa se hace una llamada al mtodo fireTableCellUptaded(row,col) dentro del mtodo setValueAt exact asignado un nuevo valor a la celda especificada; esto es debido a que, como estamos implementando directamente los mtod AbstracTableModel, debemos notificar explcitamente que una celda determinada a sido modificada para que se actualice la tabla. Puedes revisar cuales son los otros mtodos fireXXX que proporciona la clase AbstracTableModel para realizar las notifi indican modificacin sobre la tabla.
Una vez creada nuestra clase podemos instanciarla, y utilizarla para construir una tabla, asi:
MyTableModel myModel = new MyTableModel(); JTable table = new JTable(myModel);
El siguiente codigo, muestra la utilizacin de la clase MyTableModel; en este ejemplo, sta clase aparece en la aplicacion principal como una clase secundaria:
Ejemplo 4.SimpleTable4.java
import import import import import import import import javax.swing.JTable; javax.swing.table.AbstractTableModel; javax.swing.JScrollPane; javax.swing.JFrame; javax.swing.SwingUtilities; javax.swing.JOptionPane; java.awt.*; java.awt.event.*;
public class SimpleTable4 extends JFrame { public SimpleTable4() { super("SimpleTable4"); MyTableModel myModel = new MyTableModel(); JTable table = new JTable(myModel); table.setPreferredScrollableViewportSize(new Dimension(500, 70)); //Creatamos un contenedor para la Tabla JScrollPane scrollPane = new JScrollPane(table); //Agregamos nuestra tabla al contenedor getContentPane().add(scrollPane, BorderLayout.CENTER); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } class MyTableModel extends AbstractTableModel {
15 de 27
http://www.javahispano.org
final String[] columnNames = {"Nombre", "Apellido", "Pasatiempo", "Aos de Practica", "Soltero(a)"}; final Object[][] data = { {"Mary", "Campione", "Esquiar", new Integer(5), new Boolean(false)}, {"Lhucas", "Huml", "Patinar", new Integer(3), new Boolean(true)}, {"Kathya", "Walrath", "Escalar", new Integer(2), new Boolean(false)}, {"Marcus", "Andrews", "Correr", new Integer(7), new Boolean(true)}, {"Angela", "Lalth", "Nadar", new Integer(4), new Boolean(false)} }; //nicamente retornamos el numero de elementos del //array de los nombres de las columnas public int getColumnCount() { return columnNames.length; } //retormanos el numero de elementos //del array de datos public int getRowCount() { return data.length; } //retornamos el elemento indicado public String getColumnName(int col) { return columnNames[col]; } //y lo mismo para las celdas public Object getValueAt(int row, int col) { return data[row][col]; } /* * Este metodo sirve para determinar el editor predeterminado * para cada columna de celdas */ public Class getColumnClass(int c) { return getValueAt(0, c).getClass(); } /* * No tienes que implementar este mtodo a menos que * las celdas de tu tabla sean Editables */ public boolean isCellEditable(int row, int col) { return true; } /* * No tienes que implementar este mtodo a menos que * los datos de tu tabla cambien */ public void setValueAt(Object value, int row, int col) { data[row][col] = value;
16 de 27
Jtable (parte 1)
fireTableCellUpdated(row, col); } } public static void main(String[] args) { SimpleTable4 frame = new SimpleTable4(); frame.pack(); frame.setVisible(true); } }
Figura 5. SimpleTable4 en ejecucin Podemos ver que, en efecto, en la ultima columna aparece una check box para mostrar los valores booleanos, ya que implementamos el mtodo getColumnClass.
La API JTable
Campos
Resumen de los Campos Campo static int static int static int static int static int protected boolean protected int AUTO_RESIZE_ALL_CO LUMNS AUTO_RESIZE_LAST_C OLUMN Descripcin Proporciona el Cambio de tamao de Todas las columnas durante las operaciones de cambio de tamao Durante todas las operaciones de cambio de tamao, aplica el ajuste nicamente a la ltima columna
AUTO_RESIZE_NEXT_C Cuando una columna se ajusta, este campo ajusta la siguiente, OLUMN de forma opuesta AUTO_RESIZE_NEXT_O Utiliza una barra de desplazamiento para ajustar el ancho de la FF columna AUTO_RESIZE_SUBSEQ Cambia las columnas siguientes para preservar el ancho total; UENT_COLUMNS este es el comportamiento por omisin autoCreateColumnsFrom Model AutoResizeMode Si tiene el valor de true, la tabla consulta al TableModel para construir el conjunto de columnas Determina si la tabla cambia automticamente el tamao de la anchura de sus columnas para ocupar el ancho total de la tabla
17 de 27
http://www.javahispano.org
protected TableCellEditor protected boolean cellEditor cellSelectionEnabled Un objeto que sobrescribe la celda actual y permite al usuario cambiar sus contenidos Obsoleto desde la versin 1.3 El TableColumnModel de la tabla El TableModel de la table
protected columnModel TableColumnModel protected TableModel protected Hashtable protected Hashtable protected int protected int protected Component protected Color protected Dimension protected int protected int protected boolean protected Color protected Color dataModel
Una tabla de objetos que muestra y edita el contenido de cada defaultEditorsByColumnCl celda,indexado por clase como esta declarado en ass getColumnClass en la interface TableModel Una tabla de objetos que muestra el contenido de cada defaultRenderersByColum celda,indexado por clase como esta declarado en nClass getColumnClass en la interface TableModel editingColumn editingRow editorComp gridColor preferredViewportSize rowHeight rowMargin rowSelectionAllowed selectionBackground selectionForeground Identifica la columna de la celda que esta siendo editada Identifica la Fila de la celda que esta siendo editada El componente que procesa la edicin El color de la rejilla(grid) Utilizado por la interface Scrollable para determinar el area inicial visible La altura -en pixeles- de las filas de la tabla La altura -en pixeles- del margen entre las celdas en cada fila Devuelve true si se permite seleccin de fila en esta tabla El color de fondo de las celdas seleccionadas El color de primer plano de las celdas seleccionadas El ListSelectionModel de la tabla; se utiliza para controlar las filas seleccionadas Las lneas horizontales se dibujan entre las celdas cuando el campo esta en true Las lneas verticales se dibujan entre las celdas cuando el campo esta en true El JTableHeader que funciona con la tabla
protected ListSelectionMod selectionModel el protected boolean protected boolean protected JTableHeader showHorizontalLines showVerticallLines tableHeader
Constructores
Constructores Constructor JTable() JTable(int numRows, int numColumns) JTable(Object[][] rowData, Object[] columnNames) Descripcin Construye un JTable() predeterminado Construye un JTable()con numRows y numColumns de celdas vacas, utilizando DefaultTableModel Construye un JTable() visualizando los valores de rowData en una matriz bidimencional, utilizando columnNames como nombres para las columnas
18 de 27
Jtable (parte 1)
JTable(TableModel dm) JTable(TableModel dm, TableColumnModel cm) JTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm) JTable(Vector rowData, Vector columnNames) Construye un JTable() con dm como modelo de tabla, un modelo de columna predeterminado y un modelo de seleccion predeterminado Construye un JTable() con dm como modelo de tabla, cm como modelo de columna y un modelo de seleccion predeterminado Construye un JTable() con dm como modelo de tabla, cm como modelo de columna y sm como modelo de seleccin Construye un JTable() para visualizar los valores del Vector de Vectores, rowData, con nombres de columnas dados en columnNames
Mtodos
Mtodos Mtodo void void void void void void int void void void void addColumn(TableColumn aColumn) addColumnSelectionInterval(int index0, int index1) addNotify() Descripcin Aade la columna aColumn al final de la matriz de columnas Aade las columnas desde index0 a index1, incluidam a la seleccin actual llama al mtodo configureEnclosingScrollPane
addRowSelectinInterval(int index0, Aade las filas desde index0 a index1,incluida, a la int index1) seleccin actual clearSelection() Deselecciona todas las columnas y filas seleccionadas
columnAdd(TableColumnModelEv Invocado cuando una columna es agregada al modelo de ent e) columa columnAtPoint(Point point) Obtiene el ndice de la columna en que point reside, o -1 si esta fuera del rango[0, getcolumn()-1]
columnMarginChanged(ChangeEv Invocado cuando una columna se mueve debido al cambio ent e) de margenes columnMoved(TableColumnModel Invocado cuando una columna cambia de posicin Event e) columnRemoved(TableColumnMo Invocado cuando una columna es removida del modelo de delEvent e) columnas actual columnSelectionChanged(ListSele Invodado cuando el modelo de seleccin del TableColumnModel a cambiado ctionEvent e) configureEnclosingScrollPane() Configura los JScrollPane constenidos instalando el TableHeader de la tabla, columnHeaderView del panel de desplazamiento y as sucesivamente Mapea el indice de la columna de la vista en viewColumnIndex al ndice de la columna en el modelo de la tabla Mapea el indice de la columna en el modelo de tabla en modelColumnIndex al ndice de la columna en la vista Obtiene el modelo de objeto de columna predeterminado, que es un DefaultTableColumnModel
protected void
Crea columnas predeterminadas para la tabla a partir del createDefaultColumnsFromModel( modelo de datos utilizando los mtodos getColumnCount() y getColumnClass() definidos ) en la interface TableModel
19 de 27
http://www.javahispano.org
protected TableModel protected void protected void protected ListSelectionM odel static JScrollPane boolean boolean void void AccessibleCont ext boolean int TableCellEdito r TableCellEdito r Rectangle TableCellRende rer boolean TableColumn Class int TableColumnMod el String boolean TableCellEdito r createDefaultDataModel() createDefaultEditors() createDefaultRenderers() Obtiene el modelo de objetos de la tabla predeterminado, que es un DefaultTableModel Crea editores de celdas predeterminados para objetos, nmeros y boolenos Crea renderizadores predeterminados para objetos, nmeros, doubles, dates, booleanos, e iconos Devuelve el modelo de seleccin de objetos predeterminado, que es un DefaultSelectionModel Obsoleto. Reemplazado por JScrollPane(aTable) Inicia la edicin en la celda situada en row, col, si sta es editable Inicia la edicin en la celda situada en row, col, si sta es editable llamado cuando la edicin se cancela llamado cuando termina la edicin Obtiene el AccessibleContext asociado con la JTable Determina si la tabla es capaz de crear colunas predeterminadas a partir del modelo actual Obtiene el modo de cambio de tamao automtico de la tabla Devuelve el cellEditor Obtiene el editor adecuado para la celda situada en row y column Devuelve un Rectangle que localiza la celda que reside en la interseccin de row y column Devuelve un rederizador adecuado para la celda ubicada en row y column Devuelve true si la seleccion de columnas y filas esta habilitada Devuelve el objeto TableColumn para la columna en la tabla cuyo indicador sea igual a identifier, cuando se compara utilizando equals Devuelve el tipo de columna en una posicin de la vista dada Devuelve el nmero de columnas del modelo de columna(ste numero puede ser distinto del nmero de columnas en el modelo de la tabla) Devuelve el TableColumnModel que contiene toda la informacin de columnas de la tabla Obtiene el nombre de la columna en la posicin column de la vista actual Devuelve true si se pueden seleccionas las columnas Devuelve el editor que se debe utilizar cuando no se ha configurado nign editor en un TableColumn
createDefaultSelectionModel() createScrollPaneForTable(JTable a table) editCellAt(int row, int col) editCellAt(int row, int col, EventObject e) editingCanceled(ChangeEvent e) editingStoped(ChangeEvent e) getAccessibleContext() getAutoCreateFromModel() getAutoResizeMode() getCellEditor() getCellEditor(int row, int column) getCellRect(int row, int column, boolean includeSpacing) getCellRenderer(int row, int column) getCellSelectionEnabled()
getColumn(Object identifier)
getColumnClass(int column)
getColumnCount()
20 de 27
Jtable (parte 1)
TableCellRende rer int int Component Color Dimension TableModel Dimension int int int boolean int boolean boolean int int int int [] int int int [] Color Color ListSelectionM odel boolean boolean JTableHeader getDefaultRenderer(Class columnClass) getEditingColumn() getEditingRos() getEditorComponent() getGridColor() getInterCellSpacing() getModel() Devuelve el renderizador que se debe utilizar cando no se ha seleccionado un renderizador en un TableColumn Devuelve el ndice de la columna de la celda que se encuentra actualmente en edicin Devuelve el ndice de la fila de la celda que se encuentra actualmente en edicin Devuelve el componente que esta manejando la sesin de edicin Devuelve Devuelve el color utilizado para dibujar las lneas de la rejilla Devuelve el espaciamiento vertical y horizontal entre celdas Retorna el TableModel que proporciona los datos mostrados por el receptor
getPreferredScrollableViewPortSiz Devuelve el tamao predefinido del ViewPort para la e() tabla getRowCount() getRowHeght() getRowMargin() getRowSelectionAllowed() getScrollableBlockIncrement(Rect angle visibleRect, int orientation, int direction) Devuelve el nmero de filas en la tabla Devuelve la altura, en pixeles, de una fila de la tabla Devuelve la cantidad de espacio libre entre las filas Devuelve true si se pueden seleccionas las filas Devuelve el visibleRect.height o visibleRect.width dependiendo de la orientacin de la tabla
getScrollableTracksViewportHeigh Devuelve true si la altura del ViewPort no determina la t() altura de la tabla getScrollableTracksViewportWidth Devuelve true si la anchura del ViewPort no determina () la anchura de la tabla getScrollableUnitIncrement(Recta ngle visibleRect, int orientatio, int direction) getSelectedColumn() getSelectedColumnCount() getSelectedColumns() getSelectedRow() getSelectedRow() getSelectedRows() getSelectionBackground() getSelectionForeground() getSelectionModel() getShowHorizontalLines() getShowVerticaltalLines() getTableHeader() Devuelve el incremento en desplazamiento, en pixeles, que expone completamente una nueva fila o columna Devuelve el ndice de la primera columna seleccionada -1 si no hay columna seleccionada Devuelve el nmero de columnas seleccionadas Obtiene los ndices de todas las columnas seleccionadas Devuelve el ndice de la primera fila seleccionada -1 si no existen filas seleccionadas Devuelve el nmero de filas seleccionadas Obtiene los ndices de todas las filas seleccionadas Obtiene el color de fondo para las celdas seleccionadas Obtiene el color de primer plano para las celdas seleccionadas Obtiene el ListSelectionModel que se utiliza para mantener el estado de seleccin de la fila Devuelve true si el recetor dibuja lneas horizontales entre las celdas y false si no es as Devuelve true si el recetor dibuja lneas verticales entre las celdas y false si no es as Devuelve el tableHeaderutilizado por la tabla
21 de 27
http://www.javahispano.org
TableUI Object protected void boolean boolean boolean boolean boolean boolean void protected String Component Component protected boolean void void void void protected void int void void void void void void getUI() getValueAt(int row, int column) initializeLocalVars() isCellEditable(int row, int column) isCellSelected(int row, int column) isColumnSelected(int column) isEditing() isManagingFocus() isRowSelected(int row) moveColumn(int column, int targetColumn) paramString() prepareEditor(TableCellEditor editor, int row, int column) Devuelve el objeto L&F que renderiza este componente Devuelve el valor de la celda ubicada en row, column Inicia las propiedades de tabla con sus valores predeterminados Devuelve true si la celda ubicada en row, column puede editarse Devuelve true si la celda ubicada en row, column esta seleccionada Devuelve true si la columna ubicada en column esta seleccionada Devuelve true si la tabla esta editando una celda Sobrescrito para devolver true Devuelve true si la fila ubicada en row esta seleccionada Mueve la columna column a la posicin ocupada actualmente por la columna targetColumn Devuelve una representacion en String de la Tabla Prepara el editpr dado utilizando el valor de la celda dada
prepaRenderer(TableCellRenderer Prepara el renderizador dado con un valor adecuado del DataModel renderer, int row, int column) processKeyBinding(KeyStroke ks, Invocado para procesar el conjunto de teclas para ks, KeyEvent e, int condition, boolean como resultado de procesar KeyEvent e pressed) removeColumn(TableColumn aColumn) Elimina la columna aColumn de la matiz de columnas de la JTable
removeColumnSelectionInterval(in Deselecciona las columnas, desde index0hasta index1, t index0, int index1) incluyendolo removeEditor() removeRowSelectionInterval(int index0, int index1) resizeAndRepaint() Descarta el objeto editor Deselecciona las filas, desde index0hasta index1, incluyendolo Equivalente a llamar a revalidate() seguido de repaint() Devuelve el ndice de la fila sobre la cual se situua el punto point, -1 si el resultado no esta en el rango [0, getColumnCount()-1] Selecciona todas las columnas, filas y celdas en la tabla
setAutoCreateColumnsFromModel Asingna el indicador autocreateColumnsFromModel de () la tabla setAutoResize() setCellEditor(TableCellEditor anEditor) setCellSelectionEnabled(boolean flag) setColumnModel() Activa el modo de cambio de tamao automtico de la tabla cuando sta cambia de tamao Asigna la variable cellEditor Determina si la tabla permitir tanto la seleccin de filas como de columnas al mismo tiempo Asigna el modelo de columna para esta tabla a newModel y registra receptores de notificacin para el nuevo modelo de columna
22 de 27
Jtable (parte 1)
void void void setColumnSelectionAllowed(boole Asigna si las columnas de esta tabla pueden ser an flag) seleccionadas setColumnSelectionInterval(int index0, int index1) setDefaultEditor(Class columnClass, TableCellEditor editor) setDefaultRenderer(Class columnClass, TableCellRenderer renderer) setEditingColumn(int acolumn) setEditingRow(int aRow) setGridColor(Color newColor) setIntercellSpacing(Dimension newSpacing) setModel(TableModel newModel) Selecciona las columnas desde index0, hasta index1, incluido Asigna el editor predeterminado que debe utilizarse si no se asigna un editor a un TableColumn Asigan un renderizador predeterminado que se utilizar si no se asigna un renderizador a TableColumn Asigna la variable editingColumn Asigna la variable editingRow Asigna el color utilizado para dibujar las lneas de la rejilla con newColor y visualiza de nuevo el receptor Asigna la anchura y altura entre las celdas a newSpacing y dibuja de nuevo el receptor Asigna el modelo de datos para esta tabla a newModel y registra los receptores de modificaciones para el nuevo modelo de datos
void void void void void void void void void void void void void void void void void void void void void void void
setPreferredScrollableViewportSiz Asigna el tamao del viewport para esta tabla e(Dimension size) setRowHeight(int newHeight) setRowHeight(int row, int newHeight) setRowMargin(int newMargin) setRowSelectionAllowed(boolean flag) setRowSelectionInterval(int index0, int index1) setSelectionMackgrond(Color selectionBackground) setSelectionForeground(Color selectionForeground) setSelectionMode(int selectionMode) setSelectionModel(ListSelectionM odel newModel) setShowGrid(boolean b) setShowHorizontalLines(boolean b) setShowVerticalLines(boolean b) setTableHeader(JTableHeader newHeader) setUI(TableUI ui) Asigna la altura newHeight, en pixeles, de las filas Asigna la altura newHeight, en pixeles, de la fila row Asigna la cantidad de espacio libre entre las filas Asigna si las filas de esta tabla pueden ser seleccionadas Selecciona las filas desde index0, hasta index1, inclusive Asigna el color de fondo para las celdas seleccionadas Asigna el color de primer plano para las celdas seleccionadas Asigna el modo de seleccin de tabla para permitir seleccin simple, un intervalo simple continuo intervalos mltiples Asigna el modelo de seleccin de filas newModel para esta tabla Asigna si se dibujan las lneas alrededor de las celdas Asigna si se dibujan lneas horizontales entre las celdas Asigna si se dibujan lneas verticales entre las celdas Asigna el tableHeader que trabaja con esta tabla a newHeader Asigna el L&F que renderiza este componente
setValueAt(Object aValue, int row, Asigna el objeto aValue a la celda ubicada en row, int column) column setSizeColumnsToFit(boolean lastColumnOnly) Obsoleto. reemplazado por sizeClumnsToFit(int)
23 de 27
http://www.javahispano.org
void void setSizeColumnsToFit(int resizingColumn) tableChanged(TableModelEvent e) unconfigureEnclosingScrollPane() updateUI() valueChanged(ListSelectionEvent e) Cambia el tamao de una o s columnas en la tabla para que la anchura total de todas las columnas de la JTable sea igual a la anchura de la tabla Invocado cuando el TableModel de la tabla genera un TableModelEvent Anula los efectos de configureEnclosingScrollPane reemplazando columnHeaderView del panel de desplazamiento por null Llamado por UIManager cuando se cambia el L&F Invocado cuando cambia la seleccin
La API DefaultTableModel
Campos
Resumen de los Campos Campo protected Vector protected Vector columnIdentifiers dataVector Descripcin Un vector de identificadores de columna Un vector de valores Object
Constructores
Resumen de los Constructores Constructor DefaultTableModel() DefaultTableModel(int numRows, int numColumns) DefaultTableModel(Object[][] data, Object[] columnNames) DefaultTableModel(Object[] columnNames, int numRows) DefaultTableModel(Vector columnNames, int numRows) DefaultTableModel(Vector data, Vector columNames) Descripcin Construye un DefaultTableModel Construye un DefaultTableModel con numRows y numColumns Construye un DefaultTableModel e inicia la tabla pasando data y columnNames al mtodo setDataVector() Construye un DefaultTableModel con un nmero de columnas equivalentes al nmero de elementos o valores nulos en columnNames y numRows Construye un DefaultTableModel con un nmero de columnas equivalentes al nmero de elementos o valores nulos en columnNames y numRows Construye un DefaultTableModel e inicia la tabla pasando data y columnNames al mtodo setDataVector()
Mtodos
Resumen de los Mtodos Mtodo void void addColumnn(Object columnName) addColumnn(Object columnName, Object[] columnData) Descripcin Aade una columna al modelo Aade una columna al modelo
24 de 27
Jtable (parte 1)
void void void public static Vector public static Vector int String Vector int Object void void boolean void void void void void void void void void void void void addColumnn(Object columnName, Vector columnData) addRow(Object[] rowData) addRow(Vector rowData) convertToVector(Object[] anArray) Aade una columna al modelo Aade una fila al final de modelo Aade una fila al final de modelo Obtiene un Vector que contiene los mismos objetos que el array Obtiene un Vector de vectores que contiene los mismos valores que la matriz anArray Devuelve el nmero de columnas en esta tabla de datos Aade una fila al final de modelo Devuelve el Vector de Vectores que contiene los valores de datos de la tabla Devuelve el nmero de filas en esta tabla de datos Devuelve un valor de atributo para la celda en la posicin row, column Inserta una fila en row en el modelo Inserta una fila en row en el modelo Devuelve true si la celda ubicada en row, column se puede editar Muee una o ms filas comenzando desde starIndex hasta endIndex y las coloca en toIndex
convertToVector(Object[][] anArray) getColumnCount() getColumnName(int column) getDataVector getRowCount() getValueAt(int row, int column) insertRow(int row, Object[][] rowData) insertRow(int row, Vector rowData) isCellEditable(int row, int column) moveRow(int startIndex, endIndex, int toIndex)
newDataAvailable(TableModelEvent Equivalente a fireTableChanged() event) newRowsAdded(TableModelEvent event) removeRow(int row) rowsRemoved(TableModelEvent event) setColumnsIdentifiers(Object[] newIdentifiers) setColumnsIdentifiers(Vector newIdentifiers) setDataVector(Object[][] newData, Object[] columnNames) setDataVector(Vector newData, Vector columnNames) setNumRows(int newSize) setRowCount(int rowCount) setValueAt(Object aValue, int row, int column) Este mtodo permite asegurar que las nuevas filas tienen el nmero correcto de columnas Elimina del modelo la fila ubicada en row Equivalente a fireTableChanged() Reemplaza los identificadores de columna del modelo Reemplaza los identificadores de columna del modelo Reemplaza el valor de la variable de instancia dataVector por los valores de la matriz newData Reemplaza el valor de la variable de instancia dataVector por los valores del Vector: newData Asigna el nmero de filas del modelo.Obsoleto desde la v1.3 Fija el nmero de filas del modelo Asigna el valor del objeto para row y column
25 de 27
http://www.javahispano.org
La API AbstractTableModel
Campos
Resumen de los Campos Campo protected EventListener ListenerList Descripcin La lista de todos los Listener
Constructores
Constructores Constructor AbstractTableModel() Descripcin
Mtodos
Resumen de los Mtodos Mtodo void int void void void void void void void Class String Descripcin
addTableModelListener(TableM Agrega a un listener a la lista que se notifica cada vez que ocurre odelListener l) un cambio al modelo de los datos findColumn(String columnName) Retorna una columna dado su nombre
fireTableCellUpdated(int row, int Notifica a todos los listeners que el valor de la celda[firstRow, column) lastRow], ha sido actualizado Reenvia la notificacion del evento dado a todos los fireTableChanged(TableModelE TableModelListeners que se registraron como listener para vent e) este modelo de tabla fireTableDataChanged() fireTableRowsDeleted(int firstRow, int lastRow) fireTableRowsInserted(int firstRow, int lastRow) fireTableRowsUpdated(int firstRow, int lastRow) fireTableStructuredChanged() getColumnClass (int columnIndex) getColumnName(int column) Notifica a todos los listeners que el valor de todas las celdas en la tabla, pueden haber cambiado Notifica a todos los listeners que las filas dentro del rango [firstRow, lastRow], inclusive, han sido eliminadas Notifica a todos los listeners que las filas dentro del rango [firstRow, lastRow], inclusive, han sido insertadas Notifica a todos los listeners que las filas dentro del rango [firstRow, lastRow], inclusive, han sido actualizadas Notifica a todos los listeners que la estructura de la tabla a sido actualizada Retorna un Object.class sin tomar en cuenta a columnIndex Retorna un nombre predefinido para la columna usando el estilo de la hoja de clculo: A, B, C,...
EventListe Devuelve un areglo con todos los listener del tipo dado en este getListeners(Class listenerType) ner [] modelo. boolean void isCellEditable(int rowIndex, int columnIndex) Retorna false; pero se puede sobreescribir y devolver true para que las celdas sean editables
removeTableModelListener(Tabl Elimina un listener de la lista, esta se notifica cada vez que ocurre eModelListener l) un cambio en el modelo de datos.
26 de 27
Jtable (parte 1)
void setValueAt(Object aValue, int rowIndex, int columnIndex) Es un mtodo vaco que no debe ser implementado si el modelo de datos no es editable
Comentarios finales Como hemos visto, la creacin de tablas se convierte en una tarea sencilla cuando comenzamos a conocer las clases auxiliares que la acompaan para mejorar su rendimiento y eficiencia; la finalidad de este primer artculo es precisamente empezar a familializarte con estas clases, en futuros artculos comenzaremos a tratar el manejo de eventos relacionados con las tablas y la realizacin de tareas ms complejas.
Referencias
Swing Tutorial Matthew Robinson & Pavel Vorobiev Capitulo 18. JTables http://www.manning.com/Robinson/chapter18.pdf Tutorial de Swing en SUN http://java.sun.com/docs/books/tutorial/uiswing/components/table.html La Biblia de Java 2 Steven Holzner Ed. Anaya Multimedia/Coriolis ISBN: 84-415-1037-7
Puede descargar el codigo de los ejemplos: jtable.zip Isaac Ruz, RuGI, egresado del ITI (Istmo de Tehuantepec, Oaxaca, Mexico) en la Carrera de Ingeniera en Sistemas Computacionales, es actualmente desarrollador independiente Java con intenciones de realizar el examen de certificacin Cuando no esta programando o navegando (?) le gusta mucho leer todo aquello que le de el mas pequeo indicio de como llegar al Valhala o por lo menos a Avalon =:D Para cualquier duda o comentario: RuGI_ARROBA_javahispano.com
27 de 27