java - 如何使用 Vaadin 8.1 在树形网格中设置多个级别?

标签 java vaadin vaadin8

我需要在 vaadin 树网格中显示三个级别。我使用“setItems”方法根据 vaadin 文档将值设置为树网格。如何为网格设置第三个嵌套级别。

    TreeGrid<Project> treeGrid = new TreeGrid<>();
    treeGrid.setItems(getProjects(), Project::getSubProjects);
    treeGrid.addColumn(Project::getName).setCaption("Name");
    treeGrid.addColumn(Project::getStatus).setCaption("Status");

我已遵循 vaadin 8.1 文档 https://vaadin.com/docs/-/part/framework/components/components-treegrid.html 中的代码片段

最佳答案

您有 2 个选择。假设您有类似的内容:

public class Project {
    private List<Project> subProjects;

    public List<Project> getSubProjects(){};
}
  • 第一个也是最简单的解决方案是向树提供根项目列表和子项目提供程序(一种检索给定项目的子项目的方法):treeGrid.setItems(rootProjects, Project::getSubProjects);

  • 或者,如果您确实需要,您可以为每个子项列表指定父项,但您可能需要递归地执行此操作。来自 documentation link you provided :data.addItems(newProject, newProject.getChildren()); (或treeGrid.getTreeData().addItems(newProject, newProject.getSubProjects()))


使用第一种方法的功能齐全的 sscce (从 Vaadin sampler 窃取):

public class BasicTreeGrid extends VerticalLayout {

    // used to generate some random data
    private final Random random = new Random();

    public BasicTreeGrid() {
        // basic tree setup
        TreeGrid<Project> treeGrid = new TreeGrid<>();
        addComponent(treeGrid);
        treeGrid.addColumn(Project::getName).setCaption("Project Name").setId("name-column");
        treeGrid.addColumn(Project::getHoursDone).setCaption("Hours Done");
        treeGrid.addColumn(Project::getLastModified).setCaption("Last Modified");

        // some listeners for interaction
        treeGrid.addCollapseListener(event -> Notification
                .show("Project '" + event.getCollapsedItem().getName() + "' collapsed.", Notification.Type.TRAY_NOTIFICATION));
        treeGrid.addExpandListener(event -> Notification
                .show("Project '" + event.getExpandedItem().getName() + "' expanded.", Notification.Type.TRAY_NOTIFICATION));


        // add the list of root projects and specify a provider of sub-projects
        treeGrid.setItems(generateProjectsForYears(2010, 2016), Project::getSubProjects);
    }

    // generate some random projects
    private List<Project> generateProjectsForYears(int startYear, int endYear) {
        List<Project> projects = new ArrayList<>();

        for (int year = startYear; year <= endYear; year++) {
            Project yearProject = new Project("Year " + year);

            for (int i = 1; i < 2 + random.nextInt(5); i++) {
                Project customerProject = new Project("Customer Project " + i);
                customerProject.setSubProjects(Arrays.asList(
                        new LeafProject("Implementation", random.nextInt(100), year),
                        new LeafProject("Planning", random.nextInt(10), year),
                        new LeafProject("Prototyping", random.nextInt(20), year)));
                yearProject.addSubProject(customerProject);
            }
            projects.add(yearProject);
        }
        return projects;
    }


    // basic parent (or intermediate child) bean used for easy binding
    class Project {
        private List<Project> subProjects = new ArrayList<>();
        private String name;

        public Project(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }

        public List<Project> getSubProjects() {
            return subProjects;
        }

        public void setSubProjects(List<Project> subProjects) {
            this.subProjects = subProjects;
        }

        public void addSubProject(Project subProject) {
            subProjects.add(subProject);
        }

        public int getHoursDone() {
            return getSubProjects().stream().map(project -> project.getHoursDone()).reduce(0, Integer::sum);
        }

        public Date getLastModified() {
            return getSubProjects().stream().map(project -> project.getLastModified()).max(Date::compareTo).orElse(null);
        }
    }


    // basic final child (can not have other children) bean used for easy binding
    class LeafProject extends Project {
        private int hoursDone;
        private Date lastModified;

        public LeafProject(String name, int hoursDone, int year) {
            super(name);
            this.hoursDone = hoursDone;
            lastModified = new Date(year - 1900, random.nextInt(12), random.nextInt(10));
        }

        @Override
        public int getHoursDone() {
            return hoursDone;
        }

        @Override
        public Date getLastModified() {
            return lastModified;
        }
    }
}

结果:

tree grid in action

关于java - 如何使用 Vaadin 8.1 在树形网格中设置多个级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45429492/

相关文章:

java - ModelMapper配置错误(无法配置映射)

java - 使 html 标签在 GWT 中可选择

java - 带有 Vaadin 的嵌套表单/显示集合的内容

java - Vaadin 操作一些小部件的几个基本问​​题

java - 如何手动填充表格/网格

java - 子Activity与父Activity之间数据传输失败

java - 单元测试 "glue"代码或没有任何真正逻辑的代码

vaadin - 在 kotlin js 项目中使用 Vaadin 组件

java - 为什么 Kerberos/SPNEGO 身份验证不起作用?

java - Vaadin 8 - 应用程序范围的缓存