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:
- compila y ejecuta la aplicación. El fichero fuente está en SimpleTableDemo.java.
Puedes ver la página Empezar con Swing si necesitas ayuda.- 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.- 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].- 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.- 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];
}
}