| <div id="midcolumn"> |
| <h3>Examples</h3> |
| <div id="introText"> |
| <p> |
| In this section you will find some examples on how to use the NatTable. |
| </p> |
| </div> |
| |
| <div id="doccontent"> |
| <div class="chapter"> |
| <h5>Creating a basic grid</h5> |
| <div class="content"> |
| In this example we will create a basic grid that will show objects of type Person. |
| You will need to the follow these steps to setup the grid: |
| <ol> |
| <li>Assemble the Layer stacks depending on the features you wish to enable. Every region has a layer stack backing it.</li> |
| <li>Add/modify configuration object to customize behaviour.</li> |
| </ol> |
| In this example we will create a grid with the following features enabled. |
| <ol> |
| <li>Reorder columns</li> |
| <li>Hide columns</li> |
| <li>Scrolling</li> |
| <li>Selection</li> |
| </ol> |
| |
| <h6>Plugging data</h6> |
| <p>The primary interface for providing data to NatTable is <span class="code">IDataProvider</span>. |
| The most common way of providing data to the table is to use a List data structure. This list contains an object for |
| each row in the table. Each property of the row object is represented in a column.</p> |
| |
| <p>In this example we are using a POJO named person to represent the data in a row.</p> |
| <div class="codeBlock">public class Person { |
| private int id; |
| private String name; |
| private Date birthDate; |
| |
| public Person(int id, String name, Date birthDate) { |
| this.id = id; |
| this.name = name; |
| this.birthDate = birthDate; |
| } |
| |
| public int getId() {return id;} |
| public String getName() {return name;} |
| public Date getBirthDate() {return birthDate;} |
| }</div> |
| <p>If you are using a List as your data structure, you can use the <span class="code">ListDataProvider</span> out of the box. |
| In this case our data provider will look like so</p> |
| <div class="codeBlock">propertyNames = new String[] { "id", "name", "birthDate" }; |
| new ListDataProvider(people, new ReflectiveColumnPropertyAccessor(propertyNames));</div> |
| <p>The <span class="code">ReflectiveColumnPropertyAccessor</span> uses standard java getter methods to read data from the |
| row object. If you wish to fetch data from your row object in specific ways, you can plugin a custom |
| <span class="code">IColumnPropertyAccessor</span> here.</p> |
| |
| <h6>Setting up the body region</h6> |
| <p>In this stack we are plugging in the column reorder, column hide show, selection layer and scrolling functionality. |
| The viewport is a window into the complete data set. In other words this is the rows/columns visible in the table. |
| As you scroll the viewport moves over the underlying data set. The data provider should be wrapped up by the |
| <span class="code">DataLayer</span>. <span class="code">The DataLayer</span> is always the lowermost layer in the stack. |
| Its is responsible for providing data to the grid.</p> |
| <div class="codeBlock">public class BodyLayerStack extends AbstractLayerTransform { |
| |
| private SelectionLayer selectionLayer; |
| |
| public BodyLayerStack(IDataProvider dataProvider) { |
| DataLayer bodyDataLayer = new DataLayer(dataProvider); |
| ColumnReorderLayer columnReorderLayer = |
| new ColumnReorderLayer(bodyDataLayer); |
| ColumnHideShowLayer columnHideShowLayer = |
| new ColumnHideShowLayer(columnReorderLayer); |
| selectionLayer = new SelectionLayer(columnHideShowLayer); |
| ViewportLayer viewportLayer = new ViewportLayer(selectionLayer); |
| setUnderlyingLayer(viewportLayer); |
| } |
| |
| public SelectionLayer getSelectionLayer() { |
| return selectionLayer; |
| } |
| }</div> |
| |
| <h6>Setting up the column header region</h6> |
| <p>Since the column header has a dependence on the body layer and hence inherits features from it. |
| All it needs to do in most cases is to have a data provider. This data provider will supply data for the column labels.</p> |
| <div class="codeBlock">public class ColumnHeaderLayerStack extends AbstractLayerTransform { |
| |
| public ColumnHeaderLayerStack(IDataProvider dataProvider) { |
| DataLayer dataLayer = new DataLayer(dataProvider); |
| ColumnHeaderLayer colHeaderLayer = |
| new ColumnHeaderLayer( |
| dataLayer, bodyLayer, bodyLayer.getSelectionLayer()); |
| setUnderlyingLayer(colHeaderLayer); |
| } |
| }</div> |
| |
| <h6>Setting up the row header layer</h6> |
| <p>The row header is similar the column header. Note that the data layer also tracks the sizes of the rows/columns. |
| Hence, you can set the default sizes in the constructor for the data layer.</p> |
| <div class="codeBlock">public class RowHeaderLayerStack extends AbstractLayerTransform { |
| |
| public RowHeaderLayerStack(IDataProvider dataProvider) { |
| DataLayer dataLayer = new DataLayer(dataProvider, 50, 20); |
| RowHeaderLayer rowHeaderLayer = |
| new RowHeaderLayer( |
| dataLayer, bodyLayer, bodyLayer.getSelectionLayer()); |
| setUnderlyingLayer(rowHeaderLayer); |
| } |
| }</div> |
| |
| <h6>Setting up the corner layer</h6> |
| <p>The corner layer derives all its feature set from the column and row header layers. |
| Hence, it can be set up very simply by passing in the dependents.</p> |
| <div class="codeBlock">DefaultCornerDataProvider cornerDataProvider = |
| new DefaultCornerDataProvider(colHeaderDataProvider, rowHeaderDataProvider); |
| CornerLayer cornerLayer = |
| new CornerLayer( |
| new DataLayer(cornerDataProvider), rowHeaderLayer, columnHeaderLayer);</div> |
| |
| <h6>Drum roll ...</h6> |
| <p>Now we have setup layer stacks for all regions in the grid. These stacks need to be unified to work as a coherent whole. |
| We do this by placing a grid layer on the top. This layer is set as the underlying layer for NatTable and we are all ready to go.</p> |
| <div class="codeBlock">GridLayer gridLayer = |
| new GridLayer(bodyLayer, columnHeaderLayer, rowHeaderLayer, cornerLayer); |
| NatTable natTable = new NatTable(parent, gridLayer);</div> |
| |
| </div> |
| </div> |
| </div> |
| </div> |