Вам нужно создать собственную форму поля для формы, расширив DefaultFieldFactory.
См. https://vaadin.com/book/-/page/components.form.html (на полпути на странице о том, как это сделать). Это позволит вам переопределить способ генерации полей формы по умолчанию. Это, однако, не обеспечивает простой способ обрабатывать пользовательские поля и преобразования так, как вы хотите.
К счастью, есть хорошее расширение, которое я использую, чтобы легко создавать настраиваемые поля и преобразования свойств, называемые плагином настраиваемых полей.
https://vaadin.com/directory#addon/customfield
С помощью этого компонента вы можете легко расширять существующие поля и добавлять пользовательские преобразования.
Поскольку примеров того, как это сделать, не так много, ниже приведен пример того, как различные части пользовательского FieldFactory и пользовательского поля работают вместе.
открытый класс CustomFieldFactory extends DefaultFieldFactory {
public DefaultProfileTableFieldFactory() {
}
@Override
public Field createField(Container container, Object itemId, Object propertyId, Component uiContext) {
if (propertyId.equals(YOURCUSTOMPROP)) {
Select select = new Select();
select.addItem(ITEM1);
select.addItem(ITEM2);
select.addItem(ITEM3);
return new SelectCustomField(select, String.class);
} else {
return super.createField(container, itemId, propertyId, uiContext);
}
}
private static class SelectCustomField extends FieldWrapper<String> {
protected SelectCustomField(Field wrappedField, Class<? extends String> propertyType) {
super(wrappedField, propertyType);
VerticalLayout l = new VerticalLayout();
l.addComponent(wrappedField);
setCompositionRoot(l);
l.setSizeUndefined();
this.setSizeUndefined();
wrappedField.setSizeUndefined();
}
@Override
protected String parse(Object value) throws ConversionException {
// parse value from select to your model
}
@Override
protected Object format(String value) {
// format model from your model to value to be shown
}
}
}