ConfigRegistry configRegistry = new ConfigRegistry();
// Summary row fixed on top
DataLayer dataLayer = new DataLayer(dataProvider);
ViewportLayer viewportLayer = new ViewportLayer(dataLayer);
// Plug in the SummaryRowLayer
SummaryRowLayer summaryRowLayer = new SummaryRowLayer(dataLayer, configRegistry, false);
// configure the SummaryRowLayer to be rendered standalone
summaryRowLayer.setStandalone(true);
CompositeLayer composite = new CompositeLayer(1, 2);
composite.setChildLayer("SUMMARY", summaryRowLayer, 0, 0);
composite.setChildLayer(GridRegion.BODY, viewportLayer, 0, 1);
NatTable natTable = new NatTable(panel, composite, false);
GridDataFactory.fillDefaults().grab(true, true).applyTo(natTable);
// Configure custom summary formula for a column
natTable.addConfiguration(new ExampleSummaryRowConfiguration(dataProvider));
natTable.addConfiguration(new DefaultNatTableStyleConfiguration());
natTable.setConfigRegistry(configRegistry);
natTable.configure();
// Summary row fixed at the bottom
dataLayer = new DataLayer(dataProvider);
// IMPORTANT:
// since the summary row layer is to the bottom of the viewport layer
// we need to configure a GridLineCellLayerPainter that clips the top
// cell. This means the body data layer is clipped at the bottom since
// the painter is used globally
dataLayer.setLayerPainter(new GridLineCellLayerPainter(false, true));
viewportLayer = new ViewportLayer(dataLayer);
// Plug in the SummaryRowLayer
summaryRowLayer = new SummaryRowLayer(dataLayer, configRegistry, false);
// configure the SummaryRowLayer to be rendered standalone
summaryRowLayer.setStandalone(true);