2010-09-12 10 views
15

Qual è la differenza tra JTable.getModel().getColumnName() e JTable.getColumnModel().getColumn(index).getHeaderValue()? I due non sembrano condividere alcun dato. La mia ipotesi è che TableModel.getColumnName() indichi la rappresentazione testuale di una colonna mentre TableColumn.getHeaderValue() e TableColumn.getHeaderRenderer() determinano l'aspetto della colonna (non è necessario che sia un testo normale).TableModel vs ColumnModel: chi possiede il valore della colonna?

Cosa garantisce che i due siano mantenuti sincronizzati? Cosa succede se i due conflitti?

risposta

27

Rispondendo alla mia domanda:

Se un JTable è costruito con un TableModel ma senza un TableColumnModel il JTable creerà un TableColumnModel utilizzando createDefaultColumnModel() e impostare autoCreateColumnsFromModel su true. Quando questa proprietà è true, lo JTable popolerà il TableColumnModel con i valori dello TableModel.

Nessuno sembra garantire che i due siano sincronizzati. Case in point, JTable.getColumnName() restituirà il nome della colonna TableModel indipendentemente da ciò che lo TableColumnModel visualizza effettivamente sullo schermo.

Un'altra cosa interessante che ho notato è che TableModel è limitato alle colonne di stringhe mentre TableColumnModel consente di passare qualsiasi oggetto allo TableCellRenderer. Javadoc says indica che i valori sono limitati alle stringhe, ma in realtà questo è specifico dell'implementazione. Niente ti impedisce di scrivere un'implementazione che utilizza un valore JComponent.

In sintesi: TableColumnModel è il proprietario finale dei valori di colonna. TableColumnModel richiede solo TableModel per i valori solo se non ne ha già uno. Ad esempio, nel caso in cui si passi una colonna in JTable.addColumn() senza specificare un valore di intestazione.

+1

E puoi risincronizzarli con 'JTable.createDefaultColumnsFromModel()' http://download.oracle.com/javase/6/docs/api/javax/swing/JTable.html#createDefaultColumnsFromModel() –

Problemi correlati