summaryrefslogtreecommitdiffstats
path: root/documentation/components/components-tree.asciidoc
blob: abeb652f92b37090e5838ce908b5ce5073a0debd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
---
title: Tree
order: 22
layout: page
---

[[components.tree]]
= [classname]#Tree#

ifdef::web[]
[.sampler]
image:{live-demo-image}[alt="Live Demo", link="http://demo.vaadin.com/sampler/#ui/grids-and-trees/tree"]
endif::web[]

The [classname]#Tree# component allows a natural way to represent data that has
hierarchical relationships, such as filesystems or message threads. The
[classname]#Tree# component in Vaadin works much like the tree components of
most modern desktop user interface toolkits, for example in directory browsing.

The typical use of the [classname]#Tree# component is for displaying a
hierachical menu, like a menu on the left side of the screen, as in
<<figure.components.tree>>, or for displaying filesystems or other hierarchical
datasets. The [parameter]#menu# style makes the appearance of the tree more
suitable for this purpose.


[source, java]
----
final Object[][] planets = new Object[][]{
        new Object[]{"Mercury"}, 
        new Object[]{"Venus"},
        new Object[]{"Earth", "The Moon"},    
        new Object[]{"Mars", "Phobos", "Deimos"},
        new Object[]{"Jupiter", "Io", "Europa", "Ganymedes",
                                "Callisto"},
        new Object[]{"Saturn",  "Titan", "Tethys", "Dione",
                                "Rhea", "Iapetus"},
        new Object[]{"Uranus",  "Miranda", "Ariel", "Umbriel",
                                "Titania", "Oberon"},
        new Object[]{"Neptune", "Triton", "Proteus", "Nereid",
                                "Larissa"}};
        
Tree tree = new Tree("The Planets and Major Moons");

/* Add planets as root items in the tree. */
for (int i=0; i<planets.length; i++) {
    String planet = (String) (planets[i][0]);
    tree.addItem(planet);
    
    if (planets[i].length == 1) {
        // The planet has no moons so make it a leaf.
        tree.setChildrenAllowed(planet, false);
    } else {
        // Add children (moons) under the planets.
        for (int j=1; j<planets[i].length; j++) {
            String moon = (String) planets[i][j];
            
            // Add the item as a regular item.
            tree.addItem(moon);
            
            // Set it to be a child.
            tree.setParent(moon, planet);
            
            // Make the moons look like leaves.
            tree.setChildrenAllowed(moon, false);
        }

        // Expand the subtree.
        tree.expandItemsRecursively(planet);
    }
}

main.addComponent(tree);
----

<<figure.components.tree>> below shows the tree from the code example in a
practical situation.

[[figure.components.tree]]
.A [classname]#Tree# Component as a Menu
image::img/tree-example1.png[]

You can read or set the currently selected item by the value property of the
[classname]#Tree# component, that is, with [methodname]#getValue()# and
[methodname]#setValue()#. When the user clicks an item on a tree, the tree will
receive an [classname]#ValueChangeEvent#, which you can catch with a
[classname]#ValueChangeListener#. To receive the event immediately after the
click, you need to set the tree as [classname]#setImmediate(true)#.

The [classname]#Tree# component uses [classname]#Container# data sources much
like the [classname]#Table# component, with the addition that it also utilizes
hierarchy information maintained by a [classname]#HierarchicalContainer#. The
contained items can be of any item type supported by the container. The default
container and its [methodname]#addItem()# assume that the items are strings and
the string value is used as the item ID.