如何修复网格中的对象集?
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()
中,您可以创建一个渲染器来定义字段(coachName
和 playerSet
)在网格中的显示方式。
让我们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
}
在我的应用程序中,我有一个 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()
中,您可以创建一个渲染器来定义字段(coachName
和 playerSet
)在网格中的显示方式。
让我们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
}