tree组件

没看到以前用的tree组件,

Vaadin 有个tree add-on,如果你不嫌弃的话:

build.gradle:

repositories {
...
    maven {
        url='https://maven.vaadin.com/vaadin-addons'
    }
}

dependencies {
...
    implementation 'org.vaadin.tatu:tree:3.1.0'
}

view XML:

<vbox id="treeBox" height="100%" width="30%"/>

TreeNode class:

@JmixEntity(name = "jm2_TreeNode")
public class TreeNode {
    @JmixGeneratedValue
    @JmixId
    private UUID id;

    private TreeNode parent;

    @InstanceName
    private String name;

    private Set<TreeNode> childrenNodes = new HashSet<>();

    public Set<TreeNode> getChildrenNodes() {
        return childrenNodes;
    }

    public void setChildrenNodes(Set<TreeNode> childrenNodes) {
        this.childrenNodes = childrenNodes;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public TreeNode getParent() {
        return parent;
    }

    public void setParent(TreeNode parent) {
        this.parent = parent;

        if(parent != null){
            parent.addChild(this);
        }
    }

    public void addChild(TreeNode child){
        this.childrenNodes.add(child);
    }

    public UUID getId() {
        return id;
    }

    public void setId(UUID id) {
        this.id = id;
    }
}

controller class:

private void createTree() {
    var tree = new Tree<>(TreeNode::getId);

    var root1 = dataManager.create(TreeNode.class);
    root1.setName("Root 1");

    var root2 = dataManager.create(TreeNode.class);
    root2.setName("Root 2");

    var child1 = dataManager.create(TreeNode.class);
    child1.setName("Child 1");
    child1.setParent(root1);

    var child2 = dataManager.create(TreeNode.class);
    child2.setName("Child 2");
    child2.setParent(root1);

    var child3 = dataManager.create(TreeNode.class);
    child3.setName("Child 3");
    child3.setParent(root2);

    tree.setItems(List.of(root1, root2), TreeNode::getChildrenNodes);

    tree.setItemIconProvider(item ->
         item.getName().contains("Root")? VaadinIcon.HOME:VaadinIcon.BELL
    );
    tree.setItemCaptionProvider(TreeNode::getName);

    tree.addExpandListener(event -> System.out.println(event.getItems().size() + " nodes expanded."));
    tree.addCollapseListener(event -> System.out.println(event.getItems().size() + " nodes collapsed."));

    tree.asSingleSelect().addValueChangeListener(event -> {
        if (event.getValue() != null)
            System.out.println(event.getValue().getName() + " selected");
    });
    tree.setHeightFull();
    tree.setWidthFull();
    treeBox.add(tree);
}

结果:
image

好的,感谢