org.jdesktop.swingx.table
Class ColumnFactory

java.lang.Object
  extended by org.jdesktop.swingx.table.ColumnFactory

public class ColumnFactory
extends Object

Creates and configures TableColumnExts.

TODO JW: explain types of configuration - initial from tableModel, initial from table context, user triggered at runtime.

JXTable delegates all TableColumn creation and configuration to a ColumnFactory. Enhanced column configuration should be implemented in a custom factory subclass. The example beautifies the column titles to always start with a capital letter:

 
    MyColumnFactory extends ColumnFactory {
        //@Override
        public void configureTableColumn(TableModel model, 
            TableColumnExt columnExt) {
            super.configureTableColumn(model, columnExt);
            String title = columnExt.getTitle();
            title = title.substring(0,1).toUpperCase() + title.substring(1).toLowerCase();
            columnExt.setTitle(title);
        }
    };
 
 
By default a single instance is shared across all tables of an application. This instance can be replaced by a custom implementation, preferably "early" in the application's lifetime.

 ColumnFactory.setInstance(new MyColumnFactory());
 
Alternatively, any instance of JXTable can be configured individually with its own ColumnFactory.
  
 JXTable table = new JXTable();
 table.setColumnFactory(new MyColumnFactory());
 table.setModel(myTableModel);
 
  

See Also:
JXTable.setColumnFactory(ColumnFactory)

Constructor Summary
ColumnFactory()
           
 
Method Summary
 void configureColumnWidths(JXTable table, TableColumnExt columnExt)
          Configures column initial widths properties from JXTable.
 void configureTableColumn(TableModel model, TableColumnExt columnExt)
          Configure column properties from TableModel.
 TableColumnExt createAndConfigureTableColumn(TableModel model, int modelIndex)
          Creates and configures a TableColumnExt.
 TableColumnExt createTableColumn(int modelIndex)
          Creates a table column with modelIndex.
 int getDefaultPackMargin()
          Returns the default pack margin.
static ColumnFactory getInstance()
          Returns the shared default factory.
protected  int getRowCount(JXTable table)
          Returns the number of table view rows accessible during row-related config.
 void packColumn(JXTable table, TableColumnExt columnExt, int margin, int max)
          Configures the column's preferredWidth to fit the content.
 void setDefaultPackMargin(int margin)
          Sets the default pack margin.
static void setInstance(ColumnFactory factory)
          Sets the shared default factory.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

ColumnFactory

public ColumnFactory()
Method Detail

getInstance

public static ColumnFactory getInstance()
Returns the shared default factory.

Returns:
the shared instance of ColumnFactory
See Also:
setInstance(ColumnFactory)

setInstance

public static void setInstance(ColumnFactory factory)
Sets the shared default factory. The shared instance is used by JXTable if none has been set individually.

Parameters:
factory - the default column factory.
See Also:
getInstance(), JXTable.getColumnFactory()

createAndConfigureTableColumn

public TableColumnExt createAndConfigureTableColumn(TableModel model,
                                                    int modelIndex)
Creates and configures a TableColumnExt. JXTable calls this method for each column in the TableModel.

Parameters:
model - the TableModel to read configuration properties from
modelIndex - column index in model coordinates
Returns:
a TableColumnExt to use for the modelIndex
Throws:
NPE - if model == null
IllegalStateException - if the modelIndex is invalid (in coordinate space of the tablemodel)
See Also:
createTableColumn(int), configureTableColumn(TableModel, TableColumnExt), JXTable.createDefaultColumnsFromModel()

createTableColumn

public TableColumnExt createTableColumn(int modelIndex)
Creates a table column with modelIndex.

The factory's column creation is passed through this method, so subclasses can override to return custom column types.

Parameters:
modelIndex - column index in model coordinates
Returns:
a TableColumnExt with modelIndex
See Also:
createAndConfigureTableColumn(TableModel, int)

configureTableColumn

public void configureTableColumn(TableModel model,
                                 TableColumnExt columnExt)
Configure column properties from TableModel. This implementation sets the column's headerValue property from the model's columnName.

The factory's initial column configuration is passed through this method, so subclasses can override to customize.

Parameters:
model - the TableModel to read configuration properties from
columnExt - the TableColumnExt to configure.
Throws:
NullPointerException - if model or column == null
IllegalStateException - if column does not have valid modelIndex (in coordinate space of the tablemodel)
See Also:
createAndConfigureTableColumn(TableModel, int)

configureColumnWidths

public void configureColumnWidths(JXTable table,
                                  TableColumnExt columnExt)
Configures column initial widths properties from JXTable. This bare-bones implementation sets the column's preferredWidth using it's prototype property.

TODO JW - rename method to better convey what's happening, maybe initializeColumnWidths like the old method in JXTable.

Parameters:
table - the context the column will live in.
columnExt - the Tablecolumn to configure.
See Also:
JXTable.getPreferredScrollableViewportSize()

packColumn

public void packColumn(JXTable table,
                       TableColumnExt columnExt,
                       int margin,
                       int max)
Configures the column's preferredWidth to fit the content. It respects the table context, a margin to add and a maximum width. This is typically called in response to a user gesture to adjust the column's width to the "widest" cell content of a column.

This implementation loops through all rows of the given column and measures the renderers pref width (it's a potential performance sink). Subclasses can override to implement a different strategy.

Note: though 2 * margin is added as spacing, this does not imply a left/right symmetry - it's up to the table to place the renderer and/or the renderer/highlighter to configure a border.

Parameters:
table - the context the column will live in.
columnExt - the column to configure.
margin - the extra spacing to add twice, if -1 uses this factories default
max - an upper limit to preferredWidth, -1 is interpreted as no limit
See Also:
setDefaultPackMargin(int), JXTable.packTable(int), JXTable.packColumn(int, int)

getRowCount

protected int getRowCount(JXTable table)
Returns the number of table view rows accessible during row-related config. All row-related access is bounded by the value returned from this method. Here: delegates to table.getRowCount().

Subclasses can override to reduce the number (for performance) or support restrictions due to lazy loading, f.i. Implementors must guarantee that view row access with 0 <= row < getRowCount(JXTable) succeeds.

Parameters:
table - the table to access
Returns:
valid rowCount

getDefaultPackMargin

public int getDefaultPackMargin()
Returns the default pack margin.

Returns:
the default pack margin to use in packColumn.
See Also:
setDefaultPackMargin(int)

setDefaultPackMargin

public void setDefaultPackMargin(int margin)
Sets the default pack margin.

Note: this is not really a margin in the sense of symmetrically adding white space to the left/right of a cell's content. It's simply an amount of space which is added twice to the measured widths in packColumn.

Parameters:
margin - the default marging to use in packColumn.
See Also:
getDefaultPackMargin(), packColumn(JXTable, TableColumnExt, int, int)