Cómo utilizar Tablas

Con la clase JTable, puedes mostrar tablas de datos. JTable no contiene datos, es sólo una vista de tus datos. Esta forma de caché hace que JTable funcione bien, incluso cuando los datos vienen de una enorme base de datos. JTable tiene demasiadas características para poder ser descritas completamente en este tutorial, por eso sólo nos referiremos a las caracterísitcas más utilizadas por la mayoría de los programadores.

Para utilizar JTable, deberás escribir un modelo de datos -- un objeto que suministre datos a la tabla. Puedes hacer esto creando una subclase de JTableDataModelAdapter. Un modelo de datos contiene métodos para obtener y seleccionar valores de datos, obtener el número de filas (registros) de datos, y para añadir o eliminar oyentes de eventos. [Los oyentes de Tabla son objetos como JTable que son notificados cada ver que el modelo de datos cambia.]

Cuando inicialices una JTable, deberás proporcionar un objeto JTableColumn para cada columna. Cada objeto JTableColumn identifica una columna de datos y específica como deberían ser mostrados.

Aquí tienes una imagen de una aplicación que muestra una tabla en un panel desplazable:


Intenta esto:
  1. compila y ejecuta la aplicación. El fichero fuente está en SimpleTableDemo.java.
    Puedes ver la página Empezar con Swing si necesitas ayuda.
  2. Pulsa sobre una celda.
    La fila entera es seleccionada. Esto es intencionado para recordarte que JTable implementa una base de datos no una hoja de cálculo.
  3. Posiciona el cursor sobre la cabecera "First Name". Ahora pulsa el botón del ratón y arrastra la cabecera a la derecha.
    Como puedes ver, los usuarios pueden reordenar las columnas de la tabla. Este posicionamiento flexible es porque las columnas están especificadas como objetos en vez de índices [como se utiliza para las filas].
  4. Posiciona el cursor al borde derecho de la cabecera. Ahora pulsa el botón del ratón y arrastralo a la derecha o la izquierda.
    La columna cambia de tamaño.
  5. Redimensiona la ventana que contiene la tabla para que sea mayor que el contenido completo de la tabla.
    Las celdas de la tabla permanecen con el mismo tamaño, y permanecen en la esquina superior izquierda del área de pantalla.

Abajo tienes el código de SimpleTableDemo.java que implementa la tabla del ejemplo anterior.

//En el código de inicialización de una subclase de JPanel:
	MyDataModel myDataModel = new MyDataModel();
	JTable table = new JTable(myDataModel);

	for (int columnIndex = 0; 
	         columnIndex < myDataModel.numColumns;
	         columnIndex++) {
	    JTableColumn newColumn = new JTableColumn(
				     myDataModel.getColumnName(columnIndex));
	    table.addColumn(newColumn);
	    newColumn.sizeWidthToFit();
	}

        //Crea el panel desplazable y le añade la tabla. 
	JScrollPane scrollPane = new JScrollPane();
	scrollPane.getViewport().add(table);  

	//hace que la cabecera de la tabla no se desplace.
	JViewport columnHeading = new JViewport();
	columnHeading.setView(table.getTableHeader());
	columnHeading.setLayout(new BoxLayout(columnHeading, 	//HACK
					      BoxLayout.X_AXIS));
	scrollPane.setColumnHeading(columnHeading);
. . .
class MyDataModel extends JTableDataModelAdapter {
    
    //Datos inútiles.
    final Object[][] data = {
	{"First Name", "Mary", "Alison", "Kathy", "Mark", "Angela"},
	{"Last Name", "Campione", "Huml", "Walrath", "Andrews", "Lih"},
	{"Sport", "Snowboarding", "Rowing", "Chasing toddlers", "Speed reading", "Teaching high school"},
	{"Est. Years Experience", "5", "3", "2", "20", "4"},
    };

    public int numColumns = data.length;
    protected int numRows = data[0].length - 1;

    public int getRowCount() {
	return numRows;
    }

    public Object getValueAt(Object columnIdentifier, int rowIndex) {
	for (int columnIndex = 0; columnIndex < numColumns; columnIndex++) {
	    if (data[columnIndex][0].equals(columnIdentifier)) {
		return data[columnIndex][rowIndex+1];
	    }
	}
	return "NO DATA";
    }

    public void setValueAt(Object aValue,
			   Object columnIdentifier,
			   int rowIndex) {
    }

    /** This method isn't in TableDataModel.  */
    public String getColumnName(int columnIndex) {
	return (String)data[columnIndex][0];
    }
}


Ozito