Лучший способ реализовать `addValueChangeListener` для сложного компонента Vaadin?

#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