Como usar un JTable

Con un JTable es posible crear tablas de datos y opcionalmente permitirle al usuario editar la información que hay en ella.
Ejemplo de un JTable con datos:

El resto de este artículo de JTable esta acompañada de algunas tareas comunes. Acá algunos temas:

Creando una tabla simple

La tabla del ejemplo JTableSimple.java declara los nombres de las columnas en un array de String:

String[] nombreColumnas = {"Nombre",
"Apellido",
"Deporte",
"# de años",
"Vegetariano"};

Ahora los datos están inicializados en una array bidimensional de objetos:

Object[][] datos = {
{"Mary", "Campione",
"Snowboarding", new Integer(5), new Boolean(false)},
{"Alison", "Huml",
"Rowing", new Integer(3), new Boolean(true)},
{"Kathy", "Walrath",
"Knitting", new Integer(2), new Boolean(false)},
{"Sharon", "Zakhour",
"Speed reading", new Integer(20), new Boolean(true)},
{"Philip", "Milne",
"Pool", new Integer(10), new Boolean(false)}
};

Luego la tabla es construida usando los datos y los nombres de las columnas

JTable tabla = new JTable(datos, nombreColumnas);

Hay dos constructores de la JTable que aceptan directamente los datos:

  • JTable(Object[][] datos, Object[] nombreColumnas);
  • JTable(Vector datos, Vector nombreColumnas);

Estos constructores son fáciles de usar, sin embargo, tiene ciertas desventajas:

  • Todas las celdas quedarían editables
  • Los datos quedan como String, es decir, si se agrega por ejemplo un boolean, se despliega como String
  • Debes de estar interactuando entre vecto de datos – tabla – vector de datos constantemente para manipular datos

Si quieres evitar estas restricciones debes de implementar tu propio modelo de tabla

Agregando la tabla a un contenedor

Lo usual y lo mas correcto seria agregar la tabla a un JScrollPane, pues con este contendedor permite que la tabla se vea correctamente sin importar el tamaño.

JScrollPane scrollPane = new JScrollPane(tabla);
tabla.setFillsViewportHeight(true);

Qué hacen esas dos líneas?
• El scrollpane crea una referencia hacia la tabla, entonces la tabla se agrega y se ajusta directamente al scrollpane
• Cuando esta propiedad está en true la tabla se expande acaparando todo el contenedor.

El scrollpane automaticamente pone la tabla en el tope, de esta forma el encabezado de la tabla queda visible en todo momento.
Si por alguna razón no se fuera a utilizar un scrollpane se debe poner ella misma:

contenedor.setLayout(new BorderLayout());
contenedor.add(tabla.getTableHeader(), BorderLayout.PAGE_START);
contenedor.add(tabla, BorderLayout.CENTER);

Configurando y cambiando el ancho de las columnas

Por defecto las columnas tienen un mismo tamaño de ancho rellenando el largo de la tabla automaticamente. Cuando se espande o se contrae el tamaño de la tabla, todas sus columnas se vuelven a redimencionar apropiadamente.

Si el usuario redimenciona una columna arrastrando el borde, las demás columnas también se redimencionarán para ajustarse al tamaño actual de la tabla o en el pero de los casos, la tabla también se redimenciona.

Para estableces los tamaños iniciales de cada columna se debe invocar al método setPreferredWidth para cada una de las columnas que conformen la tabla. Éste método le da un valor inicial o relativo a el ancho de una columna. Por ejemplo, añadiente el siguiente código al ejemplo JTableSimple, hará que la tercera columna sea mas grande que las demás:

TableColumn column = null;
for (int i = 0; i < 5; i++) {
column = tabla.getColumnModel().getColumn(i);
if (i == 2) {
column.setPreferredWidth(100); // la tercera columna sera la mas grande
} else {
column.setPreferredWidth(50);
}
}

Como se presentó en el código anterior, cada columna de la tabla esta representada por un objeto TableColumn.
TableColumn nos provee métodos setter y getter para minimum, preferred, y maximum widths de las columnas. Por ejemplo, podemos darle el ancho necesario a una tabla según el contenido de las celdas, para que solo tome el tamaño adecuado y no mas de la cuenta. Para eso usamos el método initColumnSizes que vemos en el ejemplo TablaRender.java.

Cuando el usuario explicitamente cambia el ancho de las columnas, si se cambia también el ancho de la tabla, por alguna razón el ancho de las columnas queda como e usuario la dejó la última vez, para ello, se puede invocar el método setAutoResizeMode que arregla el ancho de las columnas.

  1. tillo
    dic 5th, 2010 at 18:36 | #1

    Hola, necesito saber como grabo en la base de datos (Ms Access), los cambios realizados sobre un JTable.

    Agradezco su ayuda.

    Saludos.

Leave a comment

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>