仅在子行上添加组件列

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" 使用该样式。