Vaadin 7 - 将按钮作为生成的属性添加到网格

Vaadin 7 - add Buttons as generatedProperty to Grid

我正在用 beanItemContainer 填充网格,我想在每一行中为不同的功能和重定向添加几个按钮。

到目前为止,我创建了一个 BeanItemContainer 并用 Generated属性Container 包装它,如下所示:

        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 图标)就足以满足我的用例。

将生成的属性添加到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。每行的许多按钮会产生视觉混乱,带走 space 否则可用于显示数据,并且还会减慢您的网格渲染速度。因此值得考虑将这些操作放在上下文菜单中。

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