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.