Vaadin 10+ Tree Grid:层次结构及其工作原理?
Vaadin 10+ Tree Grid: Hierarchies and how they work?
我一直在尝试制作具有更复杂层次结构的 Vaadin 树状网格。由于这个框架的文档非常晦涩,感觉有点不完整,我发现这个 blog thread 帮助我只得到多个 children 到一个 parent。
但是,我想要一个更复杂的系统,其中 children 将有自己的分支(children of children?)。
例如:
所以现在我被这段代码困住了,我不确定我是否走对了路。
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);
有没有人知道如何实现我想要的层次结构?
您必须使用提供数据的 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);
}
}
我一直在尝试制作具有更复杂层次结构的 Vaadin 树状网格。由于这个框架的文档非常晦涩,感觉有点不完整,我发现这个 blog thread 帮助我只得到多个 children 到一个 parent。
但是,我想要一个更复杂的系统,其中 children 将有自己的分支(children of children?)。
例如:
所以现在我被这段代码困住了,我不确定我是否走对了路。
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);
有没有人知道如何实现我想要的层次结构?
您必须使用提供数据的 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);
}
}