Java Vaadin 10+树网格:层次结构及其工作原理?

Java Vaadin 10+树网格:层次结构及其工作原理?,java,vaadin,treegrid,vaadin-grid,Java,Vaadin,Treegrid,Vaadin Grid,我一直在尝试用更复杂的层次结构制作一个Vaadin树网格。由于这个框架的文档非常模糊,而且感觉太不完整,所以我发现这只帮助我将多个孩子交给一个单亲 然而,我希望有一个更复杂的系统,在这个系统中,孩子们会有自己的分支,孩子们的分支 例如: dataProvider = new AbstractBackEndHierarchicalDataProvider<>() { @Override public int getChildCount(

我一直在尝试用更复杂的层次结构制作一个Vaadin树网格。由于这个框架的文档非常模糊,而且感觉太不完整,所以我发现这只帮助我将多个孩子交给一个单亲

然而,我希望有一个更复杂的系统,在这个系统中,孩子们会有自己的分支,孩子们的分支

例如:

 dataProvider = new AbstractBackEndHierarchicalDataProvider<>() {
            @Override
            public int getChildCount(HierarchicalQuery<TreeNode, Void> hierarchicalQuery) {
                if (hierarchicalQuery.getParent() == null) {
                    if (root == null) {
                        return 0;
                    } else {
                        return root.getChildren().size();
                    }
                } else {
                    return hierarchicalQuery.getParent().getChildren().size();
                }
            }

            @Override
            public boolean hasChildren(TreeNode treeNode) {
                return !treeNode.getChildren().isEmpty();
            }

            @Override
            protected Stream<TreeNode> fetchChildrenFromBackEnd(HierarchicalQuery<TreeNode, Void> hierarchicalQuery) {
                if (hierarchicalQuery.getParent() == null) {
                    if (root == null) {
                        return Stream.empty();
                    } else {
                        return root.getChildren().stream().skip(hierarchicalQuery.getOffset()).limit(hierarchicalQuery.getLimit());
                    }
                } else {
                    return hierarchicalQuery.getParent().getChildren().stream().skip(hierarchicalQuery.getOffset()).limit(hierarchicalQuery.getLimit());
                }
            }
        };
        treeGrid.setDataProvider(dataProvider);
所以现在我被这段代码所困扰,我不确定我是否走对了路

        TreeGrid<TreeDto> grid = new TreeGrid<>(TreeDto.class);
        grid.setHierarchyColumn("name");

        List<TreeDto> parenlist = new ArrayList<TreeDto>();
        List<TreeDto> childList = new ArrayList<TreeDto>();
        for(DataDepartment department : departmentLists) 
        {
            TreeDto parent = new TreeDto(department.getDepName(), null);
            for(DataGeneralSection section: sectionList) 
        {
                childList.add(new TreeDto(section.getSection(), parent));
            }
            parenlist.add(parent);
        }

        List<TreeDto> newList = new ArrayList<TreeDto>(parenlist);
        newList.addAll(childList);

        newList.forEach(p -> grid.getTreeData().addItem(p.getParent(), p));
        abteilungenTabs.add(grid);

有人知道我如何实现我想要的层次结构吗?

您必须使用提供数据的分层数据提供程序

例如:

 dataProvider = new AbstractBackEndHierarchicalDataProvider<>() {
            @Override
            public int getChildCount(HierarchicalQuery<TreeNode, Void> hierarchicalQuery) {
                if (hierarchicalQuery.getParent() == null) {
                    if (root == null) {
                        return 0;
                    } else {
                        return root.getChildren().size();
                    }
                } else {
                    return hierarchicalQuery.getParent().getChildren().size();
                }
            }

            @Override
            public boolean hasChildren(TreeNode treeNode) {
                return !treeNode.getChildren().isEmpty();
            }

            @Override
            protected Stream<TreeNode> fetchChildrenFromBackEnd(HierarchicalQuery<TreeNode, Void> hierarchicalQuery) {
                if (hierarchicalQuery.getParent() == null) {
                    if (root == null) {
                        return Stream.empty();
                    } else {
                        return root.getChildren().stream().skip(hierarchicalQuery.getOffset()).limit(hierarchicalQuery.getLimit());
                    }
                } else {
                    return hierarchicalQuery.getParent().getChildren().stream().skip(hierarchicalQuery.getOffset()).limit(hierarchicalQuery.getLimit());
                }
            }
        };
        treeGrid.setDataProvider(dataProvider);

必须使用提供数据的HierachicalDataProvider

例如:

 dataProvider = new AbstractBackEndHierarchicalDataProvider<>() {
            @Override
            public int getChildCount(HierarchicalQuery<TreeNode, Void> hierarchicalQuery) {
                if (hierarchicalQuery.getParent() == null) {
                    if (root == null) {
                        return 0;
                    } else {
                        return root.getChildren().size();
                    }
                } else {
                    return hierarchicalQuery.getParent().getChildren().size();
                }
            }

            @Override
            public boolean hasChildren(TreeNode treeNode) {
                return !treeNode.getChildren().isEmpty();
            }

            @Override
            protected Stream<TreeNode> fetchChildrenFromBackEnd(HierarchicalQuery<TreeNode, Void> hierarchicalQuery) {
                if (hierarchicalQuery.getParent() == null) {
                    if (root == null) {
                        return Stream.empty();
                    } else {
                        return root.getChildren().stream().skip(hierarchicalQuery.getOffset()).limit(hierarchicalQuery.getLimit());
                    }
                } else {
                    return hierarchicalQuery.getParent().getChildren().stream().skip(hierarchicalQuery.getOffset()).limit(hierarchicalQuery.getLimit());
                }
            }
        };
        treeGrid.setDataProvider(dataProvider);

您可以继续使用当前的方法进行更深入的研究。如果您有很多项目,您可能需要考虑像Simon Martinelli建议的数据提供者。

public class MainView extends VerticalLayout {

    public MainView() {
        TreeGrid<TreeItem> treeGrid = new TreeGrid<>();
        treeGrid.addHierarchyColumn(TreeItem::getValue);

        setSizeFull();
        treeGrid.setSizeFull();

        for (Company company: getCompanies()) {
            TreeItem companyItem = new TreeItem(company.getCompanyName());
            treeGrid.getTreeData().addItem(null, companyItem);

            for(Department department: company.getDepartments()) {
                TreeItem departmentItem = new TreeItem(department.getName());
                treeGrid.getTreeData().addItem(companyItem, departmentItem);

                for(Employee employee: department.getEmployees()) {
                    TreeItem employeeItem = new TreeItem(employee.getFullName());
                    treeGrid.getTreeData().addItem(departmentItem, employeeItem);
                }
            }
        }

        add(treeGrid);
    }
}

您可以继续使用当前的方法进行更深入的研究。如果您有很多项目,您可能需要考虑像Simon Martinelli建议的数据提供者。

public class MainView extends VerticalLayout {

    public MainView() {
        TreeGrid<TreeItem> treeGrid = new TreeGrid<>();
        treeGrid.addHierarchyColumn(TreeItem::getValue);

        setSizeFull();
        treeGrid.setSizeFull();

        for (Company company: getCompanies()) {
            TreeItem companyItem = new TreeItem(company.getCompanyName());
            treeGrid.getTreeData().addItem(null, companyItem);

            for(Department department: company.getDepartments()) {
                TreeItem departmentItem = new TreeItem(department.getName());
                treeGrid.getTreeData().addItem(companyItem, departmentItem);

                for(Employee employee: department.getEmployees()) {
                    TreeItem employeeItem = new TreeItem(employee.getFullName());
                    treeGrid.getTreeData().addItem(departmentItem, employeeItem);
                }
            }
        }

        add(treeGrid);
    }
}

因为您要求使用V10并显示V8的屏幕截图,所以应该非常小心,不要混用版本。从理论上讲,V10是一个突破性的变化——有些东西是相同的,有些则不同。因为您要求使用V10并显示V8的屏幕截图,所以您应该非常小心,不要混用不同的版本。从理论上讲,V10是一个突破性的变化——有些事情是相同的,有些则不同。