-
Notifications
You must be signed in to change notification settings - Fork 12
Configuration
NatTable allows to use configuration to customize the styling and behavior of the layers and the table . Every layer typically introduces configurations for the features they add.
Configurations are registered via registries. There are two configuration registries for each NatTable instance:
This is a global object holding the configuration attributes for the following kinds of configuration:
- Styling
- Editing
- Comparators for sorting
- Any other information that should be configurable
This is a global object holding the following kinds of configuration:
- Key bindings
- Mouse bindings
It is recommended to create separate configuration classes to encapsulate the different configurations. It is also possible to put configurations directly into a registry which is mostly used for dynamic behavior changes at runtime. There are four types of configuration classes:
-
AbstractRegistryConfiguration
Used to register configuration values to theIConfigRegistry. -
AbstractUiBindingConfiguration
Used to bind actions to UI interactions viaIUIBindingRegistry. -
AbstractLayerConfiguration
Used to configure anILayer. This typically means to registerILayerCommandHandlerandILayerEventHandleron a layer. -
AggregateConfiguration
Used to combine several configurations in one. Several default configurations delivered with NatTable are implementations ofAggregateConfiguration. Using this only one configuration instance needs to be registered to add a configuration for styling and ui binding at once.
The following simplified UML diagram shows the relationship between configurations, the NatTable and layers.

In NatTable a cell can have several modes in which they are displayed. These modes are called DisplayMode. This allows to specify different configurations for the same cell in different modes. The following table lists the currently supported display modes.
| DisplayMode | Description |
|---|---|
DisplayMode#NORMAL |
The normal state a cell is in if no other state applies. |
DisplayMode#SELECT |
The state that shows that a cell is currently selected. |
DisplayMode#EDIT |
The state that shows that a cell is currently edited. Note: This DisplayMode is never applied to a cell and is only used for configuration purposes! |
DisplayMode#HOVER |
The state that shows that currently the mouse hovers over the cell. |
DisplayMode#SELECT_HOVER |
The state that shows that currently the mouse hovers over the cell that is currently selected. |
NatTable supports conditional configuration via a label mechanism. This means that it is possible to add labels to a cell and register configurations for labels.
Every cell in a NatTable has a LabelStack, which is a collection of Strings. Via labels it is possible to tie configurations to specific cells, for example styling a cell with a special error style or configure a checkbox editor for a cell that contains boolean values.
When using a CompositeLayer it is possible to set a region label per composition region. You can think of the region label as a default label that is applied to every cell in the corresponding region, e.g. every cell in the body region of a grid has the label GridRegion.BODY in its LabelStack.
Every layer is able to add labels to a cells label stack in the ILayer#getConfigLabelsByPosition(int, int) method. This way layer specific stylings are added, e.g. a sort indicator in the column header cells in case the SortHeaderLayer is involved.
It is possible to add custom labels by using an IConfigLabelAccumulator. Each layer in the layer composition can take an IConfigLabelAccumulator which can be set by calling AbstractLayer#setConfigLabelAccumulator(IConfigLabelAccumulator).
NatTable ships with several default implementations that can be used to register custom labels. Some of them implement AbstractOverrider and allow registering of labels for special criteria.
| Default implementation | Description |
|---|---|
CellOverrideLabelAccumulator |
Registers a label that is applied in case the specified value is shown in the specified column.registerOverride(Object cellValue, int col, String configLabel)
|
ColumnOverrideLabelAccumulator |
Register labels that will be added to the label stack of cells in the column of the specified index.registerColumnOverrides(int columnIndex, String… configLabels)registerColumnOverridesOnTop(int columnIndex, String… configLabels)
|
RowOverrideLabelAccumulator |
Register labels that will be added to the label stack of cells in the row of the specified index.registerOverrides(int rowIndex, String…configLabels)
|
ColumnLabelAccumulator |
Automatically registers column based labels to the label stack. The labels follow the pattern COLUMN_ + <column position>. Via the constant ColumnLabelAccumulator#COLUMN_LABEL_PREFIX concatenated with the column position, it is possible to register custom configurations for those default labels. |
It is also possible tom create a custom IConfigLabelAccumulator to handle situations where the default implementations doesn't match. By implementing IConfigLabelAccumulator#accumulateConfigLabels(LabelStack, int, int) it is possible to add additional labels to the given LabelStack. You can simply add a custom label by calling LabelStack#addLabel(String) which means it will be added to the end of the stack. To ensure the newly added label gets a higher priority the LabelStack#addLabelOnTop(String) method can be called, which will add the new label at the first position of the label stack.
Note:
Setting a label at the top of a label stack doesn’t ensure that no other layer or accumulator adds another label on top afterwards.