仅在子行上添加组件列
Add component column only on child rows
我正在 Spring boot 和 Vaadin 8 上开发应用程序,我的问题是如何仅在树状网格的子行上生成按钮。我试过这种方式,但按钮是在每一行、父项和子项上生成的。
private void setUpTreeGrid() {
treeGrid = new TreeGrid<>();
treeGrid.setSizeFull();
treeGrid.addColumn(EmployeeDto::getEmployee).setCaption("Employee").setId("employee-column");
treeGrid.addColumn(EmployeeDto::getComputer).setCaption("Computers").setId("computer-column");
treeGrid.addComponentColumn(this::deleteButton).setCaption("Delete"); // Generates a button on parent and child row
data = new TreeData<>();
data.addItems(generateEmployee(), EmployeeDto::getSubEmployee);
dataProvider = new TreeDataProvider<>(data);
treeGrid.setDataProvider(dataProvider);
addComponent(treeGrid);
}
private Button deleteButton(EmployeeDto employeeDto) {
Button button = new Button(VaadinIcons.CLOSE);
button.addStyleName(ValoTheme.BUTTON_SMALL);
button.addClickListener(e -> {
// Delete function
onChange();
});
return button;
}
这是我在树状网格中设置数据的方式
private List<EmployeeDto> generateEmployee() {
List<Employee> employees = employeeService.findAllEmployee();
List<EmployeeDto> employeeList = new ArrayList<>();
for (Employee employee : employees) {
EmployeeDto employeeDto;
employeeDto = new EmployeeDto(employee.getUserName() + " " + employee.getFirstName() + " " + employee.getLastName(), String.valueOf(employee.getComputers().size()));
if (!(employee.getComputers().isEmpty())) {
employeeList.add(employeeDto);
}
for (int i = 0; i < employee.getComputers().size(); i++) {
EmployeeDto subEmployee = new EmployeeDto();
subEmployee.setComputer(employee.getComputers().get(i).getInventoryId());
employeeDto.addSubEmployee(subEmployee);
}
}
return employeeList;
}
给你一些想法。我首先记得使用组件列作为删除按钮存在一些极端情况问题,请参阅:
https://github.com/vaadin/framework/issues/10995
我认为这也适用于 TreeGrid。
因此,一种选择是使用 ButtonRenderer 或提到的插件。
现在,从父行隐藏按钮的技巧是什么?为此,我认为您需要在 EmployeeDto 中提供足够的数据,以便可以确定它是否是父行。
如果是,您可以在有按钮的列中使用 setStyleGenerator 并在其中设置 "display: none" 使用该样式。
我正在 Spring boot 和 Vaadin 8 上开发应用程序,我的问题是如何仅在树状网格的子行上生成按钮。我试过这种方式,但按钮是在每一行、父项和子项上生成的。
private void setUpTreeGrid() {
treeGrid = new TreeGrid<>();
treeGrid.setSizeFull();
treeGrid.addColumn(EmployeeDto::getEmployee).setCaption("Employee").setId("employee-column");
treeGrid.addColumn(EmployeeDto::getComputer).setCaption("Computers").setId("computer-column");
treeGrid.addComponentColumn(this::deleteButton).setCaption("Delete"); // Generates a button on parent and child row
data = new TreeData<>();
data.addItems(generateEmployee(), EmployeeDto::getSubEmployee);
dataProvider = new TreeDataProvider<>(data);
treeGrid.setDataProvider(dataProvider);
addComponent(treeGrid);
}
private Button deleteButton(EmployeeDto employeeDto) {
Button button = new Button(VaadinIcons.CLOSE);
button.addStyleName(ValoTheme.BUTTON_SMALL);
button.addClickListener(e -> {
// Delete function
onChange();
});
return button;
}
这是我在树状网格中设置数据的方式
private List<EmployeeDto> generateEmployee() {
List<Employee> employees = employeeService.findAllEmployee();
List<EmployeeDto> employeeList = new ArrayList<>();
for (Employee employee : employees) {
EmployeeDto employeeDto;
employeeDto = new EmployeeDto(employee.getUserName() + " " + employee.getFirstName() + " " + employee.getLastName(), String.valueOf(employee.getComputers().size()));
if (!(employee.getComputers().isEmpty())) {
employeeList.add(employeeDto);
}
for (int i = 0; i < employee.getComputers().size(); i++) {
EmployeeDto subEmployee = new EmployeeDto();
subEmployee.setComputer(employee.getComputers().get(i).getInventoryId());
employeeDto.addSubEmployee(subEmployee);
}
}
return employeeList;
}
给你一些想法。我首先记得使用组件列作为删除按钮存在一些极端情况问题,请参阅:
https://github.com/vaadin/framework/issues/10995
我认为这也适用于 TreeGrid。
因此,一种选择是使用 ButtonRenderer 或提到的插件。
现在,从父行隐藏按钮的技巧是什么?为此,我认为您需要在 EmployeeDto 中提供足够的数据,以便可以确定它是否是父行。
如果是,您可以在有按钮的列中使用 setStyleGenerator 并在其中设置 "display: none" 使用该样式。