【问题标题】:How to add button in a Grid in Vaadin如何在 Vaadin 的网格中添加按钮
【发布时间】:2016-07-16 16:51:34
【问题描述】:

嗨,我尝试在 vaadin 的网格中添加按钮,但它会在按钮对象上打印引用。

Grid statementEnquiriesList = new Grid();
statementEnquiriesList.addColumn("", Button.class);
        statementEnquiriesList.addColumn("DATE/TIME", String.class);
        statementEnquiriesList.addColumn("TRANSACTION ID", String.class);
        statementEnquiriesList.addColumn("FROM", String.class);

// historyList is an array object
for (int i = 0; i < historyList.size(); i++)
{
    HistoryList recordObj = historyList.get(i);
    Button addBtn = new Button();
    addBtn.setCaption("Add");
    statementEnquiriesList.addRow(addBtn , recordObj.getDate(), recordObj.getTransactionId(), recordObj.getFrom());
}

如何在此打印“添加”标题

【问题讨论】:

  • 你检查ButtonRendererbook example了吗?
  • @Morfic 我认为您的评论就是答案。另一个链接:vaadin.com/docs/-/part/framework/components/…(参见 ButtonRenderer 段落)
  • 谢谢@Morfic。问题解决了:)按照例子
  • 酷,您可以发布自己的实现作为回复,并选择它作为此问题的正确答案(根据您的声誉,您可能需要等待几天)。这是让其他人快速找到他们可能遇到的类似问题的答案的首选方式。 @SteffenHarbich 确实如此,但这意味着作者启发了解他可以在哪里找到更多 Vaadin 细节、样本等以供他未来的工作,然后选择他自己的解决问题的方法。干杯伙计们:-)

标签: vaadin vaadin7


【解决方案1】:

Vaadin 8.1 - 网格中的组件

Vaadin 8.1 现在有一个内置的 ComponentRenderer 用于在 Grid 中显示按钮或其他组件,包括您自己的自定义组件。

参见What's New 页面上的第一项“网格中的组件”。

示例:向网格添加标签。

grid.addColumn(
    person -> new Label( person.getFullName() ) ,
    new ComponentRenderer()
).setCaption( "Full Name" ) 

【讨论】:

    【解决方案2】:

    您不能在 Vaadin 7 中直接使用网格中的组件。您必须使用 ButtonRenderer 来呈现按钮

    RendererClickListener ownerClickListener = new RendererClickListener() {
    
        private static final long serialVersionUID = 1L;
    
        @Override
        public void click(RendererClickEvent event) {
            //Someone clicked button
        }
    };
    ButtonRenderer ownerRenderer = new ButtonRenderer(ownerClickListener, "");
    grid.getColumn("ownerName").setRenderer(ownerRenderer);
    

    但您可以在 Vaadin 8 中使用组件,请参阅 Grid Components in Vaadin 8

    我使用的是 Vaadin 7,而 ButtonRenderer 对我来说并不满意,因为无法将 FontIcon 添加到按钮,也无法将其作为 HTML 插入。 相反,我使用了component renderer addon。这是我的使用方法:

    Grid grid = new Grid();
    BeanItemContainer<EventChange> dataSource = //... primary data source
    GeneratedPropertyContainer dataSource2 = new GeneratedPropertyContainer(dataSource);
    grid.setContainerDataSource(dataSource2);
    dataSource2.addGeneratedProperty("ownerWithButton", new PropertyValueGenerator<Component>() {
    
            private static final long serialVersionUID = 1L;
    
            @Override
            public Component getValue(Item item, Object itemId, Object propertyId) {
                ClickListener ownerClickListener = new ClickListener() {
    
                    private static final long serialVersionUID = 1L;
                    @Override
                    public void buttonClick(ClickEvent event) {
                        // do something, user clicked button for itemId
                    }
                };
                Button button = new Button(FontAwesome.USER);
                button.addClickListener(ownerClickListener);
                return button;
            }
    
            @Override
            public Class<Component> getType() {
                return Component.class;
            }
        });
    grid.setColumns("ownerWithButton", /*and rest of your columns*/);
    grid.getColumn("ownerWithButton").setRenderer( new ComponentRenderer());
    

    【讨论】:

    • 我正在尝试在具有 IndexedContainer 的网格上使用 v7 中的此插件,但我无法使用。我试图按照这个例子(或演示源中的 ClassicGridTab.java) - 它使用 BeanItemContainer 我怀疑我的错误是由于这个。也尝试了 NotABeanGridWithDecoratorTab.java 演示,但它使用了 GeneratedPropertyContainer。所以我现在非常迷茫。有关如何使其正常工作的任何提示?
    • @Pere 您需要 GeneratedPropertyContainer 来创建返回要显示的组件的属性,并且您需要其他包含主要数据的容器。 Grid 必须使用 GeneratedPropertyContainer 数据源,才能看到原始数据和生成的数据。在我的示例中,我没有看到将数据源设置为网格,这是您的问题吗?我会尽快编辑我的答案。也许尝试创建新问题
    • 感谢您的帮助,@Piro。真的不需要编辑你的答案;你的评论澄清了这一切。会尝试你的提示;)
    猜你喜欢
    • 1970-01-01
    • 2015-09-29
    • 2015-02-07
    • 1970-01-01
    • 2017-07-17
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多