An extension of
TableColumnModel
suitable for use with
JXTable
. It extends the notion of columns considered as part of the view realm to include invisible columns. Conceptually, there are several sets of "columns":
- model columns: all columns of a
TableModel
. They are but a virtual concept, characterizable f.i. by (model) column index, (model) column name. - view columns: all
TableColumnExt
objects added to the TableColumnModelExt
, each typically created and configured in relation to a model column. These can be regarded as a kind of subset of the model columns (not literally, obviously). Each view column belongs to exactly one of the following (real) subsets: - visible columns: all view columns with the visibility property enabled
- hidden columns: all view columns with the visibility property disabled
This class manages the view columns and automatically takes care of keeping track of their location in the visible/hidden subset, triggering the corresponding changes in interested views. Typically, a view column's visibility can be toggled by user interaction, f.i. via a
ColumnControlButton
.
An example to programmatically hide the first visible column in the column model:
TableColumnExt columnExt = columnModel.getColumnExt(0); if (columnExt != null) { columnExt.setVisible(false); }
Note that it is principally allowed to add standard
TableColumn
s. Practically, it doesn't make much sense to do so - they will always be visible.
While individual visible columns can be requested by both column identifier and column index, the latter is not available for hidden columns. An example to programmatically guarantee that the view column which corresponds to the first column in the associated TableModel
.
List<TableColumn> columns = colModel.getColumns(true); for (TableColumn column : columns) { if (column.getModelIndex() == 0) { if (column instanceof TableColumnExt) { ((TableColumnExt) column).setVisible(false); } return; } }
Alternatively, the column could be requested directly by identifier. By default the column's headerValue is returned as identifier, if none is set.
Object identifier = tableModel.getColumnName(0); TableColumnExt columnExt = columnModel.getColumnExt(identifier); if (columnExt != null) { columnExt.setVisible(false); }
Relying on default identifiers is inherently brittle (
headerValue
s might change f.i. with
Locale
s), so explicit configuration of columns with identifiers is strongly recommended. A custom
ColumnFactory
helps to automate column configuration.
This class guarantees to notify registered TableColumnModelListener
s of type TableColumnModelExtListener
about propertyChanges fired by contained TableColumn
s. An example of a client which adjusts itself based on headerValue
property of visible columns:
TableColumnModelExtListener l = new TableColumnModelExtListener() { public void columnPropertyChange(PropertyChangeEvent event) { if ("headerValue".equals(event.getPropertyName())) { TableColumn column = (TableColumn) event.getSource(); if ((column instanceof TableColumnExt) && !((TableColumnExt) column).isVisible()) { return; } resizeAndRepaint(); } } public void columnAdded(TableColumnModelEvent e) { } public void columnMarginChanged(ChangeEvent e) { } public void columnMoved(TableColumnModelEvent e) { } public void columnRemoved(TableColumnModelEvent e) { } public void columnSelectionChanged(ListSelectionEvent e) { } }; columnModel.addColumnModelListener(l);
@author Richard Bair
@author Jeanette Winzenburg
@see DefaultTableColumnModelExt
@see TableColumnExt
@see TableColumnModelExtListener
@see ColumnControlButton
@see JXTable#setColumnControlVisible
@see ColumnFactory