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

问题描述 投票:1回答:2

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

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的对象。

我的问题是我只想显示玩家姓名和教练名称concat by,或者\ n。

任何想法我怎么能这样做?作为一个初学者,它对我来说很复杂

vaadin vaadin-flow
2个回答
2
投票

我看到三种选择。

第一个选项是您自己找到的选项:将它们的名称连接在一个String中。这可以这样做:

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

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

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
投票

您可以使用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,我们可以轻松地为jazxswpoi创建一个逗号分隔的字符串。

配置网格如:

playerSet

然后结果如下:

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

© www.soinside.com 2019 - 2024. All rights reserved.