Версия 7 - событие по получению фокуса

Добрый день,

Существует возможность обработки события получения фокуса компоненом?

Спасибо

Добрый день.

Такого API для UI компонентов нет, но Вы можете, получить Vaadin реализацию компонента, и, если нужный Вам компонент реализует FocusNotifier, добавить слушатель на него.

...
import com.vaadin.event.FieldEvents.FocusNotifier;
...

@Inject
private TextField<String> textField;
@Inject
private Notifications notifications;

@Subscribe
protected void onInit(InitEvent event) {
    textField.unwrap(FieldEvents.FocusNotifier.class)
            .addFocusListener(focusEvent -> notifications.create()
                    .withCaption("Focused!")
                    .show());
}

Обычно, обработку фокуса на сервере делать не стоит, поскольку для их обработки потребуется послать AJAX запрос. Если вы расскажете нам о своём варианте использования, возможно мы сможем предложить вариант решения без использования обработчиков фокуса.

Сценарий такой:

Мне надо построить иерархаическую таблицу (TreedataGrid почти подходит) , со следующими требованиями:

  • Есть строки товаров, в которых несколько полей, но редактируется только одно - количество.
  • Строки организованы в иерархию групп. Строки групп показывают суммарную информацию и не редактируются.
  • Для быстрой работы, при нажатии Enter или Tab/Shift-Tab, значение сохраняется и фокус сразу переходит к следующему/предыдущему ряду. При этом строки групп хотелось бы пропустить и сразу перейти к следующему товару в следующей группе.
  • При этом происходит пересчет других полей, в ряду - например, сумма. И пересчет (суммирование) значений в строках групп.

Обычно, для таких задач принято иметь просто плоскую таблицу товара, а в стороне дерево групп, но мне это не подходит - пользователь хочет видеть все и там много расчетных полей в строках, которые должны суммироваться в строках групп - вес, объем, суммы и т.д.