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

How to fix object set in grid?

在我的应用程序中,我有一个 class 比如:

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 连接。

知道我该怎么做吗?作为初学者,这对我来说很复杂

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

让我们classTeam喜欢

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

还有一个classPlayer喜欢

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);

那么结果如下:

我看到三个选项。

第一个选项是您自己已经找到的选项:将他们的名字连接成一个字符串。可以这样做:

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

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

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

第三种选择是在视图的一侧显示团队网格,而在另一侧显示团队网格所选项目的一些相关内容。您可以为教练使用一个单独的网格,一个用于球员,一个用于替补。如果您愿意,您也可以将此团队详细信息布局实现为单独的视图。如果您的 Team 对象将变得更加复杂,包含更多集合、集合和其他相关属性,那么此选项将变得更有吸引力,因为这相当 scalable/expandable。

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

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