我正在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;
}
答案 0 :(得分:1)
对您的想法。首先,我记得使用组件列作为删除按钮存在一些特殊情况,请参见:
https://github.com/vaadin/framework/issues/10995
我认为这也适用于TreeGrid。
所以一种选择是使用ButtonRenderer或提到的插件。
现在,从父行隐藏按钮的窍门是什么?为此,我认为您需要EmployeeDto中足够的数据,以便可以确定它是否是父行。
如果是,则可以在具有按钮的列中使用setStyleGenerator,并在其中使用该样式设置“显示:无”。