Ошибка Vaadin 14: не удается разрешить конструктор com.vaadin.flow.data.renderer.ComponentRenderer ‹›

Я пытаюсь перебрать HashMap, чтобы отобразить содержимое в сетке Vaadin14, чтобы оно выглядело следующим образом:

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

это класс java:

public class MyClass extends VerticalLayout {

    // Dummy Data
    LocalDate date1 = LocalDate.now();
    LocalDate date2 = LocalDate.now();
    LocalDate date3 = LocalDate.now();
    Boolean[] isPresent1 = {true, false, false, true, true, false, false, true, true};
    Boolean[] isPresent2 = {true, false, false, true, true, false, false, true, true};
    Boolean[] isPresent3 = {true, false, false, true, true, false, false, true, true};

    Map<LocalDate, Boolean[]> trainingsMap = new HashMap<>();

    Grid<Map.Entry<LocalDate, Boolean[]>> grid = new Grid<>();

    Icon icon;

    public MyClass() {
        // in reality data come from Spring Data - Repository - Service
        trainingsMap.put(date1, isPresent1);
        trainingsMap.put(date2, isPresent2);
        trainingsMap.put(date3, isPresent3);

        for (Map.Entry<LocalDate, Boolean[]> map : trainingsMap.entrySet()) {
            grid.addColumn(new ComponentRenderer<Component, Map<LocalDate, Boolean[]>>(createIsPresent(map.getValue())));
                   // .setHeaderRenderer(new LocalDateTimeRenderer<>(map.getKey(), "dd/MM HH:mm:ss"))); // 
        }

        grid.setItems(trainingsMap.entrySet());
        add(grid);
    }

    private Component createIsPresent(Boolean[] isPresent) {
        for (Boolean b : isPresent) {
            if (b) {
                icon = UIUtils.createPrimaryIcon(VaadinIcon.CHECK);
            }
        }
        return icon;
    }

}

Ошибка: не удается разрешить конструктор com.vaadin.flow.data.renderer.ComponentRenderer ‹>

Возможно ли это вообще или я что-то в корне делаю не так?


person Java    schedule 17.08.2019    source источник


Ответы (2)


Ошибка указывает на отсутствие доступного конструктора с указанными вами параметрами. В противном случае вы не можете передать вызов метода в качестве параметра в Java. Что вы можете сделать, так это передать ссылку на метод.

Некоторые примеры можно найти здесь:

Доступные конструкторы ComponentRender находятся здесь: Конструкторы модуля рендеринга компонентов. Вы можете использовать конструктор с SerializableSupplier, например, если он вам больше подходит.

На официальной странице документации есть несколько примеров использования средства визуализации с использованием различных конструкторов: Использование средств визуализации компонентов

Цитата оттуда:

Пример: использование ComponentRenderer с поставщиком.

grid.addColumn(
    new ComponentRenderer<>(() -> new Icon(VaadinIcon.ARROW_LEFT)));

Поэтому вам нужно изменить эту строку:

new ComponentRenderer<Component, Map<LocalDate, Boolean[]>>(createIsPresent(map.getValue()))

Надеюсь, это поможет : )

person anasmi    schedule 19.08.2019
comment
Спасибо @anasmi, возможно, можно поместить HashMap в сетку, отличную от Bean, но я думаю, что невозможно вставить также Person в первый столбец, поэтому я попробую другой способ (Polymer 3) сделать это. - person Java; 19.08.2019
comment
Может кому понадобится: grid.addColumn (new ComponentRenderer ‹› (() - ›new Icon (VaadinIcon.CHECK))); - person Java; 19.08.2019

Правильная реализация для этого будет выглядеть, как показано ниже.

import java.time.LocalDate;
import java.util.HashMap;
import java.util.Map;

import com.vaadin.flow.component.Component;
import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.icon.Icon;
import com.vaadin.flow.component.icon.VaadinIcon;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.data.renderer.ComponentRenderer;

public class MyClass extends VerticalLayout {

    // Dummy Data
    LocalDate date1 = LocalDate.now();
    LocalDate date2 = LocalDate.now();
    LocalDate date3 = LocalDate.now();
    Boolean[] isPresent1 = {true, false, false, true, true, false, false, true, true};
    Boolean[] isPresent2 = {true, false, false, true, true, false, false, true, true};
    Boolean[] isPresent3 = {true, false, false, true, true, false, false, true, true};

    Map<LocalDate, Boolean[]> trainingsMap = new HashMap<>();

    Grid<Map.Entry<LocalDate, Boolean[]>> grid = new Grid<>();

    Icon icon;

    public MyClass() {
        // in reality data come from Spring Data - Repository - Service
        trainingsMap.put(date1, isPresent1);
        trainingsMap.put(date2, isPresent2);
        trainingsMap.put(date3, isPresent3);
        grid.setItems(trainingsMap.entrySet());
        grid.addColumn(new ComponentRenderer<>(item -> createIsPresent(item.getValue())));
        add(grid);
    }

    private Component createIsPresent(Boolean[] isPresent) {
        for (Boolean b : isPresent) {
            if (b) {
                icon = UIUtils.createPrimaryIcon(VaadinIcon.CHECK);
            }
        }
        return icon;
    }

}
person Saurabh Rathore    schedule 17.01.2020