#java #user-interface #vaadin #event-listener
#java #пользовательский интерфейс #vaadin #прослушиватель событий
Вопрос:
У меня довольно сложный компонент Vaadin с семью различными входами:
public class MyComponent extends VerticalLayout
implements HasValue<ValueChangeEvent<MyPojo>, MyPojo> {
private final ComboBox<String> _objectId = new ComboBox<>();
private final TextField _accountId = new TextField();
private final TextField _personId = new TextField();
private final DatePicker _startDate = new DatePicker();
private final DatePicker _endDate = new DatePicker();
private final IntegerField _age = new IntegerField();
private final NumberField _amount = new NumberField();
private final Binder<MyPojo> _binder = new Binder<>();
// more implementation ...
}
Из-за реализованного интерфейса мне также нужно реализовать Registration addValueChangeListener(ValueChangeListener<? super ValueChangeEvent<MyPojo>> listener)
, каков наилучший способ реализовать это? Есть ли какая-то автоматизация или мне нужно сделать это вручную, например, привязать мой базовый метод полей ввода addValueChangeListener
к комплексу ValueChangeListener<? super ValueChangeEvent<MyPojo>>
? Или я мог бы как-то использовать _binder
для этого?
Ответ №1:
Вместо того, чтобы напрямую реализовывать HasValue
интерфейс, я бы порекомендовал один из абстрактных классов, которые помогут вам разобраться во всех мельчайших деталях.
В вашем случае это может быть либо AbstractCompositeField
если вы хотите иметь полный контроль над визуальным представлением, либо CustomField
если вы хотите обрабатывать такие вещи, как метка ввода.
Ответ №2:
Да, вы можете использовать один список в binder. Я нахожусь в аналогичной ситуации, и чтобы избежать объявления множества слушателей, по одному для каждого связанного поля, я только что зарегистрировался в binder. В binder доступны две регистрации событий. Один для любого измененного связанного поля, а другой, который запускает кучу ситуаций. Вот javadoc: https://vaadin.com/api/platform/21.0.8/com/vaadin/flow/data/binder/Binder.html