Не удалось захватить событие двойного щелчка, используя vaadin 7 - PullRequest
1 голос
/ 29 апреля 2019

Я изучаю Vaadin Framework.Я пытаюсь захватить событие двойного щелчка для слушателя щелчка элемента.Но это не работает, как ожидалось.Пожалуйста, обратитесь к приведенному ниже коду:

grid.addItemClickListener(e -> {
        if(e.isDoubleClick()) {
            System.out.println("Double click");
        } else {
            System.out.println("Single click");             
        }
});

Когда я дважды щелкаю элемент сетки, это считается одним щелчком мыши.

1 Ответ

3 голосов
/ 29 апреля 2019

Как упомянуто в Приемнике Doubleclick в Vaadin Grid проблема в setEditorEnabled(true), так как это предотвращает запуск события DoubleClick (так как событие двойного щелчка по сетке является триггером для Vaadin для сделать редактор видимым).

Я создал обходной путь, который, кажется, работает (вы должны проверить / оценить, что все действительно работает так, как задумано), чтобы у вас были оба:

  1. Возможность двойного щелчка и добавления прослушивателя, который реагирует на двойные клики
  2. с сеткой включен редактор

Хитрость заключается в том, чтобы сначала отключить редактор (по умолчанию он отключен), а затем включить его «самостоятельно» в ItemClickListener (если e.isDoubleClick()).

Затем вы должны использовать класс, который расширяет Grid и переопределяет метод doCancelEditor(). Внутри этого метода (который вызывается при нажатии кнопки отмены и после нажатия кнопки сохранения (после фиксации)) вы затем снова отключаете редактор после нажатия кнопки отмены и / или сохранения.

ExtendedGrid:

public class ExtendedGrid extends Grid {

    @Override
    protected void doCancelEditor() {
        super.doCancelEditor();
        setEditorEnabled(false);
        System.out.println("Editor disabled during doCancelEditor");
    }
}

MyUI:

    @Override
    protected void init(VaadinRequest vaadinRequest) {
        Grid grid = new ExtendedGrid();
        BeanItemContainer<Person> container = new BeanItemContainer<>(Person.class);
        container.addBean(new Person("marco", "test"));
        grid.setContainerDataSource(container);
        grid.addItemClickListener(e -> {
            if(e.isDoubleClick()) {
                grid.setEditorEnabled(true);
                BeanItem item = (BeanItem) e.getItem();
                grid.editItem(item.getBean());
                System.out.println("Double click");
            }
        });
        setContent(grid);
    }
...