123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- ---
- title: TreeTable
- order: 23
- layout: page
- ---
-
- [[components.treetable]]
- = [classname]#TreeTable#
-
- ifdef::web[]
- [.sampler]
- image:{live-demo-image}[alt="Live Demo", link="http://demo.vaadin.com/sampler/#ui/grids-and-trees/tree-table"]
- endif::web[]
-
- [classname]#TreeTable# is an extension of the [classname]#Table# component with
- support for a tree-like hierarchy in the first column. As with
- [classname]#Tree#, the hierarchy is determined by the parent-children
- relationships defined in the [interfacename]#Container.Hierarchical# interface.
- The default container is [classname]#HierarchicalContainer#, but you can bind
- [classname]#TreeTable# to any container implementing the interface.
-
- [[figure.components.treetable.basic]]
- .The [classname]#TreeTable# component
- image::img/treetable-basic.png[width=40%, scaledwidth=60%]
-
- As with [classname]#Tree#, you can define the parent-child relationships with
- [methodname]#setParent()#, as is shown in the following example with numeric
- item IDs:
-
- [source, java]
- ----
- TreeTable ttable = new TreeTable("My TreeTable");
- ttable.addContainerProperty("Name", String.class, null);
- ttable.addContainerProperty("Number", Integer.class, null);
-
- // Create the tree nodes and set the hierarchy
- ttable.addItem(new Object[]{"Menu", null}, 0);
- ttable.addItem(new Object[]{"Beverages", null}, 1);
- ttable.setParent(1, 0);
- ttable.addItem(new Object[]{"Foods", null}, 2);
- ttable.setParent(2, 0);
- ttable.addItem(new Object[]{"Coffee", 23}, 3);
- ttable.addItem(new Object[]{"Tea", 42}, 4);
- ttable.setParent(3, 1);
- ttable.setParent(4, 1);
- ttable.addItem(new Object[]{"Bread", 13}, 5);
- ttable.addItem(new Object[]{"Cake", 11}, 6);
- ttable.setParent(5, 2);
- ttable.setParent(6, 2);
- ----
-
- Some container types may allow defining hierarchies if the container data
- itself, without explicitly setting the parent-child relationships with
- [methodname]#setParent()#. These containers should be used if there is going
- to be a lot of data. Setting up a [interfacename]#Container.Hierarchical# before
- setting it to the [classname]#TreeTable# will improve the initial performance.
-
- Unlike [classname]#Tree#, a [classname]#TreeTable# can have components in the
- hierarchical column, both when the property type is a component type and when
- the tree table is in editable mode.
-
- For other features, we refer you to documentation for [classname]#Table# in
- <<dummy/../../../framework/components/components-table#components.table,"Table">> and [classname]#Tree# in <<dummy/../../../framework/components/components-tree#components.tree,"Tree">>.
-
- ifdef::web[]
- [[components.treetable.collapsed]]
- == Expanding and Collapsing Items
-
- As in [classname]#Tree#, you can set the expanded/collapsed state of an item
- programmatically with [methodname]#setCollapsed()#. Note that if you want to
- expand all items, there is no [methodname]#expandItemsRecursively()# like in
- [classname]#Tree#. Moreover, the [methodname]#getItemIds()# only returns the IDs
- of the currently visible items for ordinary [interfacename]#Hierarchical# (not
- [interfacename]#Collapsible#) containers. Hence you can not use that to iterate
- over all the items, but you need to get the IDs from the underlying container.
-
-
- [source, java]
- ----
- // Expand the tree
- for (Object itemId: ttable.getContainerDataSource()
- .getItemIds()) {
- ttable.setCollapsed(itemId, false);
-
- // As we're at it, also disallow children from
- // the current leaves
- if (! ttable.hasChildren(itemId))
- ttable.setChildrenAllowed(itemId, false);
- }
- ----
-
- In large tables, this explicit setting becomes infeasible, as it needs to be
- stored in the [classname]#TreeTable# (more exactly, in the
- [classname]#HierarchicalStrategy# object) for all the contained items. You can
- use a [interfacename]#Collapsible# container to store the collapsed states in
- the container, thereby avoiding the explicit settings and memory overhead. There
- are no built-in collapsible containers in the Vaadin core framework, so you
- either need to use an add-on container or implement it yourself.
-
- endif::web[]
|