Vaadin 7 - добавить кнопки как сгенерированные свойства в Grid - PullRequest
0 голосов
/ 13 ноября 2018

Я заполняю Grid beanItemContainer и хочу добавить несколько кнопок для различных функций и перенаправлений в каждой из моих строк.

Пока что я создал BeanItemContainer и обернул его в GeneratedPropertyContainer следующим образом:

        private BeanItemContainer<Foo> fooContainer = new BeanItemContainer<Foo>(Foo.class);
        private GeneratedPropertyContainer wrapperContainer = new GeneratedPropertyContainer(fooContainer);

Теперь я попытался добавить сгенерированное свойство следующим образом:

wrapperContainer.addGeneratedProperty("buttons", new PropertyValueGenerator<Button>()
        {

                    @Override
        public Button getValue(Item item, Object itemId, Object propertyId)
        {
            ClickListener fooBarClickListener = new ClickListener()
            {

                @Override
                public void buttonClick(ClickEvent event)
                {
                    // do something
                }
            };

            Button button = new Button(FontAwesome.USER);
            button.addClickListener(fooBarClickListener);
            return button;
        }

        @Override
        public Class<Button> getType()
        {
            return Button.class;
        }
    });

и далее по моему коду

getColumn("buttons").setRenderer(new ButtonRenderer());

Тем не менее, это всего лишь одна кнопка, где мне нужно несколько кнопок, кроме того, она даже не работает.

не получается, после ошибки

Cannot remove converter, as renderer's presentation type java.lang.String and column's model com.vaadin.ui.Button type aren't directly compatible with each other (in Column[propertyId:buttons])

Кроме того, вместо кнопки, для моего варианта использования будет достаточно кликабельной иконки (желательно Fontawesome).

1 Ответ

0 голосов
/ 18 ноября 2018

Шаблон добавления сгенерированного свойства в Grid выглядит следующим образом:

        Grid grid = new Grid();
        ...
        ButtonRenderer buttonRenderer = new ButtonRenderer();
        ... // add click listener etc
        GeneratedPropertyContainer gpc = rowIndex.addGeneratedProperty("button1", container);
        grid.setContainerDataSource(gpc);
        grid.getColumn("button").setRenderer(buttonRenderer);

Вам понадобится одно свойство, т.е. один столбец на кнопку.ButtonRenderer не знает, как отображать несколько кнопок в одном столбце.

В Vaadin Directory есть надстройка GridActionRenderer , которая является более продвинутым средством рендеринга, предназначенным для случая, когда вы хотите компактно установитькнопок в одном столбце, например, набор инструментов операций

https://vaadin.com/directory/component/gridactionrenderer-add-on

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

https://vaadin.com/directory/component/vaadin-contextmenu

...