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


(Mikhail Bezroukov) #1

Добрый день,

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

Спасибо


(Глеб Горелов) #2

Добрый день.

Такого 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());
}

(Юрий Артамонов) #3

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


(Mikhail Bezroukov) #4

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

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

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

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