Vaadin:网格重复数据

Вяч*_*шов 2 java grid vaadin

我写了 Grid,如示例所示。

public class MainView extends VerticalLayout {

    private final UserService userService;
    private Label label;
    private Grid<UserDto> grid;

    public MainView(UserService userService) {
        this.userService = userService;
        initComponents(userService);
    }

    private void initComponents(UserService userService) {
        initMainGrid(userService);
    }

    private void initMainGrid(UserService userService) {
        grid = new Grid<>(UserDto.class);

        grid.setItems(userService.getAll());

        grid.addColumn(UserDto::getId).setHeader("ID");
        grid.addColumn(UserDto::getUsername).setHeader("??? ????????????");
        grid.addColumn(UserDto::getPassword).setHeader("??????");
        grid.addColumn(UserDto::getEmail).setHeader("email");
        grid.addColumn(UserDto::getPhone).setHeader("???????");
        grid.addColumn(UserDto::getActive).setHeader("???????");

        add(grid);
    }
}
Run Code Online (Sandbox Code Playgroud)

但数据重复:

???????  ??? ?????????  ????????????

正如我们所见,数据显示了两次。

请指教,有什么问题吗?如何解决?

Tat*_*und 5

Class对象传递给Grid构造函数

此构造函数grid = new Grid<>(UserDto.class);将根据UserDto类的setter 和 getter 自动添加列。

不将Class对象传递给Grid构造函数

如果要使用addColumn方法配置列,则需要实例化Gridusinggrid = new Grid<>();而不传递UserDto.class.


Kas*_*rer 5

正确答案的小补充@TatuLund的

您还可以使用额外的布尔参数初始化网格,这将阻止自动生成列。通过这种方式,您在添加列时仍然可以使用属性名称(OP 不使用它,但如果他这样做了,这将是非常有用的信息)。

Grid<UserDto> grid = new Grid<>(UserDto.class, false);
grid.addColumn("id"); // this would not be possible witout passing the class in constructor
Run Code Online (Sandbox Code Playgroud)

请参阅此 Grid 构造函数的API 文档以供参考