--- 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()#. 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 <> and [classname]#Tree# in <>. 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[]