Как использовать Vaadin Action Framework в сетке Vaadin 8

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

Table aTable=new Table();
aTable.addActionHandler(new Action.Handler(){

public Action[] getActions(Object target, Object sender)
  {                           
  //example, that shows 2 options
  return new Action[] {new Action("Option 1"), new Action("Option 2")};

public void handleAction(Action action, Object sender, Object target)
  {//just prints action name for this example
   System.out.println("Action:"+action);
   }
});     

Action.Handler существует в Vaadin 8, однако невозможно добавить Action.Handler в сетку в Vaadin 8, и я не нашел другого способа создать контекстное меню.

Как можно использовать Action Framework в сетке? Есть ли у Grid какой-либо другой метод создания контекстного меню? Другими словами, как будет написан приведенный выше пример.

Существующие статьи и ответы (например, Vaadin Grid vs Table) не охватывают указанную выше тему, и это не задокументирован в документации Vaadin (https://vaadin.com/docs/-/part/framework/components/components-grid.html).


person Spyros K    schedule 30.05.2017    source источник
comment
ты больше не можешь. попробуйте реализовать строку меню.   -  person petey    schedule 31.05.2017
comment
Спасибо за подсказку, это фактически привело меня к поиску контекстного меню Vaadin.   -  person Spyros K    schedule 01.06.2017


Ответы (1)


Вы можете использовать надстройку vaadin-context-menu, представленную начиная с Vaadin 7.6 (онлайн-демонстрация и исходный код на гитхабе). Теоретически он может поддерживать любой компонент, но для сетки мы будем использовать выделенный GridContextMenu (не забудьте перекомпилировать набор виджетов).

Зависимость:

<dependency>
   <groupId>com.vaadin</groupId>
   <artifactId>vaadin-context-menu</artifactId>
   <version>2.0.0</version>
</dependency>

Реализация:

import com.vaadin.contextmenu.GridContextMenu;
import com.vaadin.icons.VaadinIcons;
import com.vaadin.ui.Grid;
import com.vaadin.ui.Notification;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;

public class MyUi extends UI {
    @Override
    protected void init(VaadinRequest request) {
        // basic grid setup
        Grid<Person> grid = new Grid<>(Person.class);
        grid.getColumns().forEach(column -> column.setHidable(true).setSortable(true));
        grid.setItems(
                new Person("Darth", "Vader"),
                new Person("Luke", "Skywalkaer"),
                new Person("Java", "De-Hut")
        );

        // grid context menu setup
        Random random = new Random();
        GridContextMenu<Person> contextMenu = new GridContextMenu<>(grid);
        // handle header right-click
        contextMenu.addGridHeaderContextMenuListener(event -> {
            contextMenu.removeItems();
            contextMenu.addItem("Hide", VaadinIcons.EYE_SLASH, selectedMenuItem -> {
                event.getColumn().setHidden(true);
            });
            contextMenu.addItem("Sort", VaadinIcons.LIST_OL, selectedMenuItem -> {
                grid.sort(event.getColumn().getId(), SortDirection.values()[random.nextInt(2)]);
            });
        });
        // handle item right-click
        contextMenu.addGridBodyContextMenuListener(event -> {
            contextMenu.removeItems();
            if (event.getItem() != null) {
                grid.select((Person) event.getItem());
                contextMenu.addItem("Info", VaadinIcons.INFO, selectedMenuItem -> {
                    Notification.show("Right-clicked item " + event.getItem());
                });
            }
        });

        // set UI content
        VerticalLayout content = new VerticalLayout();
        content.setSizeFull();
        content.addComponents(grid);
        setContent(content);
    }

    // basic bean
    public static class Person {
        private String firstName;
        private String lastName;

        public Person(String firstName, String lastName) {
            this.firstName = firstName;
            this.lastName = lastName;
        }

        public String getFirstName() {
            return firstName;
        }

        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }

        public String getLastName() {
            return lastName;
        }

        public void setLastName(String lastName) {
            this.lastName = lastName;
        }

        @Override
        public String toString() {
            return "Person{" +
                    "firstName='" + firstName + '\'' +
                    ", lastName='" + lastName + '\'' +
                    '}';
        }
    }
}

Результат:

контекстное меню сетки

person Morfic    schedule 01.06.2017