Put image in FormLayout on CrudEditor

Good morning,

I am using the component pro Crud of Vaadin. But I couldn’t get put image on my form.

Here is my code:

GrupoLabCrudView

    
    private CrudEditor<LaboratorioGrupo> createGrupoLabEditor() {
        grupoLabForm = new GrupoLabForm();
        FormLayout form = grupoLabForm.getForm();
        Binder<LaboratorioGrupo> binder = grupoLabForm.getBinder();

        return new BinderCrudEditor<>(binder, form);
    }
    
    private DataProvider<LaboratorioGrupo, Void> createGrupoLabDataProvider(){
        return DataProvider.fromCallbacks(
        query -> {
          int offset = query.getOffset();
          int limit = query.getLimit();
          List<Sort> sortOrders = new ArrayList<>();
          for (SortOrder<String> queryOrder : query.getSortOrders()) {
            Sort sort = laboratorioGrupoService.createSort(
                    queryOrder.getSorted(),
                    queryOrder.getDirection() == SortDirection.DESCENDING);
            sortOrders.add(sort);
          }

          List<LaboratorioGrupo> labs = laboratorioGrupoService.fetch(offset, limit, sortOrders);

          return labs.stream();
        },
        query -> laboratorioGrupoService.count());
    }
    
    private void createGrupoLabCrud(DataProvider<LaboratorioGrupo, ?> dataProvider){
        CrudGrid<LaboratorioGrupo> crudGrid = new CrudGrid<>(LaboratorioGrupo.class,false);
        Crud<LaboratorioGrupo> crud = new Crud<>(LaboratorioGrupo.class, crudGrid ,createGrupoLabEditor());
        crud.getGrid().removeColumnByKey("numgrupo");
        crud.getGrid().removeColumnByKey("laboratorioCollection");
        crud.getGrid().removeColumnByKey("logoString");
        crud.getGrid().removeColumnByKey("logo");
        crud.getGrid().removeColumnByKey("logoFilename");
        crud.getGrid().addThemeVariants(GridVariant.LUMO_ROW_STRIPES);
        crud.getGrid().getColumnByKey("dsg").setHeader("Designação").setSortProperty("dsg");
        crud.setDataProvider(dataProvider);
        crud.addSaveListener(e -> {
            saveOrEdit(e.getItem());
        });
        crud.addDeleteListener(e -> laboratorioGrupoService.remove(e.getItem()));
        crud.setI18n(new CrudI18n().getCrudI18n("Grupo de Laboratório"));
        add(crud);
    }
    
    @Override
    public void showRouterLayoutContent(HasElement content){
        childWrapper.getElement().appendChild(content.getElement());
    }

    private void saveOrEdit(LaboratorioGrupo laboratorioGrupo) {
        laboratorioGrupo.setLogo(grupoLabForm.getLogo());
        laboratorioGrupo.setLogoFilename(grupoLabForm.getLogoName());
        if(laboratorioGrupo.getNumgrupo() == null){
            laboratorioGrupoService.save(laboratorioGrupo);
        }else{
            laboratorioGrupoService.edit(laboratorioGrupo);
        }
    }

GrupoLabForm

    
   public class GrupoLabForm {
    
    private TextField dsg = new TextField("Designação");
    
    private byte[] logo;
    
    private String logoName;
    
    private Image image = new Image();
    
    public FormLayout getForm(){
        dsg.setMaxLength(32);
        MemoryBuffer buffer = new MemoryBuffer();
        Upload upload = new Upload(buffer);
        upload.setAcceptedFileTypes("image/jpeg", "image/png", "image/gif");
        upload.addSucceededListener(event -> {
            try {
                dsg.getElement().executeJavaScript("setTimeout(function(){$0.dispatchEvent(new CustomEvent('change', {bubbles: true, composed: true}));},0)", dsg.getElement());
                logo = IOUtils.toByteArray(buffer.getInputStream());
                logoName = event.getFileName();
                image.setSrc(new StreamResource((logoName==null)?"":logoName, () -> new ByteArrayInputStream(logo)));
                image.setMaxHeight("44px");
                image.setMaxWidth("44px");
            } catch (IOException ex) {
                Logger.getLogger(GrupoLabForm.class.getName()).log(Level.SEVERE, null, ex);
                Notification.show("Problema técnico favor entrar em contato com a central.",WebAppoloConst.TEMPO_MENSAGEM_ERRO_APLICACAO, Notification.Position.TOP_CENTER);
            }
        });
        return new FormLayout(dsg,upload,image);
    }
    
    public Binder<LaboratorioGrupo> getBinder(){
        Binder<LaboratorioGrupo> binder = new Binder<>(LaboratorioGrupo.class);
        
        SerializablePredicate<String> designacaoPredicate = value -> !dsg.getValue().trim().isEmpty();
        Binder.Binding<LaboratorioGrupo, String> designacaoBinding = binder.forField(dsg).withValidator(designacaoPredicate, "Favor preencher a designação.").bind(LaboratorioGrupo::getDsg, LaboratorioGrupo::setDsg);
        dsg.addValueChangeListener(event -> designacaoBinding.validate());
        dsg.setRequiredIndicatorVisible(true);
        
        return binder;
    }
    
    public byte[] getLogo() {
        return logo;
    }
    
    public String getLogoName() {
        return logoName;
    }
    
}

So in my case,

I would like that the image show on my form when I edit on element of my grid, but I don’t know how I could do that with my binder, because I need set on image the bytes.

Thank you all for try help.

You can create your own class that implements HasValue<?,byte>
The binder will bind your field with this class seamlessly.