Как исправить набор объектов в сетке?

В моем приложении у меня есть такой класс:

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.

Есть идеи, как я могу это сделать? Для меня как новичка это сложно


person Nirob Rasseen    schedule 28.03.2019    source источник
comment
Возможный дубликат Как я могу увидеть детали в сетке в Vaadin поток?   -  person cfrick    schedule 29.03.2019


Ответы (2)


Я вижу три варианта.

Первый вариант - это тот, который вы уже нашли: объедините их имена в одну строку. Сделать это можно так:

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 станет более сложным с большим количеством наборов, коллекций и других относительных свойств, этот вариант станет более привлекательным, поскольку он достаточно масштабируемый / расширяемый.

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

private void buildTeamDetails(Team team){
    // build your team detail layouts here
}
person kscherrer    schedule 28.03.2019
comment
Как установить имя игрока только для тех игроков, которые принадлежат к этой команде? Есть getAllPlayerBYTeamName (String s); - person Nirob Rasseen; 29.03.2019
comment
ммм, это совсем другой вопрос, но объект команды уже должен иметь только игроков, которые входят в эту команду? - person kscherrer; 29.03.2019

Вы можете настроить, какие столбцы будут отображаться в сетке, используя grid.removeAllColumns(), а затем добавив все столбцы, которые вы хотите иметь в сетке, с помощью grid.addColumn(). В addColumn() вы можете создать средство визуализации, которое определяет, как поля (coachName и playerSet) отображаются в сетке.

У нас есть класс 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 мы можем просто использовать геттер поля и легко создать разделенную запятыми строку для 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);

Тогда результат выглядит так:

введите описание изображения здесь

person codinghaus    schedule 28.03.2019
comment
Как установить имя игрока только для тех игроков, которые принадлежат к этой команде? Есть getAllPlayerBYTeamName (String s); - person Nirob Rasseen; 29.03.2019