2010-09-12 8 views
15

¿Cuál es la diferencia entre JTable.getModel().getColumnName() y JTable.getColumnModel().getColumn(index).getHeaderValue()? Los dos no parecen compartir ningún dato. Supongo que TableModel.getColumnName() indica la representación textual de una columna, mientras que TableColumn.getHeaderValue() y TableColumn.getHeaderRenderer() determinan cómo se ve la columna (no es necesario que sea texto sin formato).TableModel vs ColumnModel: ¿a quién pertenece el valor de la columna?

¿Qué garantiza que los dos se mantengan sincronizados? ¿Qué pasa si los dos entran en conflicto?

Respuesta

27

responder a mi propia pregunta:

Si un JTable se construye con un TableModel pero sin un TableColumnModel la JTable creará un TableColumnModel usando createDefaultColumnModel() y establecer autoCreateColumnsFromModel true. Cuando esta propiedad es verdadera, el JTable poblará el TableColumnModel con valores del TableModel.

Nadie parece garantizar que los dos estén sincronizados. Caso en cuestión, JTable.getColumnName() devolverá el nombre de la columna TableModel independientemente de lo que TableColumnModel realmente muestra en la pantalla.

Otra cosa interesante que noté es que TableModel está limitado a columnas de cadena mientras que TableColumnModel le permite pasar cualquier objeto al TableCellRenderer. El Javadoc says que los valores están restringidos a Cadenas, pero de hecho esto es específico de la implementación. Nada le impide escribir una implementación que usa un valor de JComponent.

En resumen: TableColumnModel es el último propietario de los valores de columna. TableColumnModel solo pregunta TableModel por valores solo si aún no tiene uno. Por ejemplo, en el caso de que pase una columna al JTable.addColumn() sin especificar un valor de encabezado.

+1

Y puede resincronizarlos con 'JTable.createDefaultColumnsFromModel()' http://download.oracle.com/javase/6/docs/api/javax/swing/JTable.html#createDefaultColumnsFromModel() –

Cuestiones relacionadas