如何修复网格中的对象集?

时间:2019-03-28 06:59:06

标签: vaadin vaadin-flow

在我的应用程序中,我有一个类似的类:

public class Team {
    private Country teamId;
    private Set<Player> playerSet;
    private Set<Player> substitutes;
    private Set<Coach> coachSet; 
}

当我实例化一个网格时:

Grid<Team> grid = new Grid<>(Team.class);

并从数据库中设置allTeam(),它显示playerSet和coachSet的对象。

我的问题是我只想显示由或\ n串联的球员姓名和教练姓名。

任何想法我该怎么做?作为初学者,这对我来说很复杂

2 个答案:

答案 0 :(得分:2)

我看到三个选择。

第一个选项是您已经发现的一个选项:将它们的名称连接在单个String中。可以这样做:

grid.addColumn(team -> {
    Set<String> coachNames = new HashSet<>();
    for (Coach coach : team.getCoaches()){
        coachNames.add(coach.getName());
    }
    return String.join(", ", coachNames);
});

第二个方法是利用Grid项目的详细信息-您可以在项目详细信息中显示教练网格。由于您想同时显示教练和球员,因此此选项可能不是最佳选择,但我想提一提这种可能性。 (可以在项目详细信息中放置两个网格,但这很奇怪。不是最佳的用户体验。)

grid.setItemDetailsRenderer(new ComponentRenderer<>(team -> {
    Grid<Coach> coachGrid = new Grid<>(Coach.class);
    coachGrid.setItems(team.getCoaches());
    return coachGrid;
}));

第三个选择是将团队网格放置在视图的一侧,在另一侧上显示团队网格所选项目的一些相关内容。您可以为教练提供单独的网格,为球员提供一个网格,为替代者提供一个网格。如果愿意,您也可以将此团队详细信息布局实现为单独的视图。如果您的Team对象随着更多的集合,集合和其他相关属性而变得更加复杂,则此选项将更具吸引力,因为它具有很好的可伸缩性。

grid.addSelectionListener(event -> {
    if(event.getFirstSelectedItem().isPresent()){
        buildTeamDetails(event.getFirstSelectedItem().get())
    }
})

private void buildTeamDetails(Team team){
    // build your team detail layouts here
}

答案 1 :(得分:1)

您可以使用grid.removeAllColumns()配置要在网格中显示的列,然后使用grid.addColumn()添加希望包含在网格中的所有列。在addColumn()中,您可以创建一个渲染器,该渲染器定义字段(coachNameplayerSet)在网格中的显示方式。

让我们像Team这样的课程

public class Team {
    private String coachName;
    private Set<Player> playerSet;
    private Set<Object> objects;
    //getters and setters
}

和类Player之类的

public class Player {
    private String firstName;
    private String lastName;
    // getters and setters
}

现在,您只希望在网格中包含教练和球员的姓名。因此,(在我的示例中)对于coachName,我们可以仅使用字段的getter,并且可以轻松地为playerSet创建带有Java流的逗号分隔的字符串。

像这样配置网格:

   grid.setItems(team);
   grid.removeAllColumns();
   grid.addColumn(new TextRenderer<>((ItemLabelGenerator<Team>) Team::getCoachName))
           .setHeader("Coach");
   grid.addColumn(new TextRenderer<>((ItemLabelGenerator<Team>) team1 -> team1.getPlayerSet().stream()
           .map(player1 -> player1.getFirstName() + " " + player1.getLastName())
           .collect(Collectors.joining(", "))))
           .setHeader("Players")
           .setFlexGrow(1);

然后结果如下:

enter image description here