Java 如何在表Vaadin 7中使用列生成器?

Java 如何在表Vaadin 7中使用列生成器?,java,user-interface,vaadin,Java,User Interface,Vaadin,我在Vaadin中实现ColumnGenerator时遇到问题。我正在读《瓦丁之书》,第5.21.5章。生成了表列,但似乎有点缺少关于如何实际实现此类功能的说明 这本书说,当您有一个列的值由其他列的值给出时,或者当您想以特定方式格式化表列时,您需要使用生成的列,然后,它给出了一个不完整的示例,其中只给出了单个ColumnGenerator的一个实现,而没有实际显示在将行添加到表中时如何使用此生成器 所以我试着自己实现这些功能,下面是我得到的: // Generated Table col

我在Vaadin中实现ColumnGenerator时遇到问题。我正在读《瓦丁之书》,第5.21.5章。生成了表列,但似乎有点缺少关于如何实际实现此类功能的说明

这本书说,当您有一个列的值由其他列的值给出时,或者当您想以特定方式格式化表列时,您需要使用生成的列,然后,它给出了一个不完整的示例,其中只给出了单个ColumnGenerator的一个实现,而没有实际显示在将行添加到表中时如何使用此生成器

所以我试着自己实现这些功能,下面是我得到的:

    // Generated Table columns
    Table tableWithGeneratedCol = new Table();
    tableWithGeneratedCol.addContainerProperty(
            "date",     Date.class,   null, "Date",         null, null);
    tableWithGeneratedCol.addContainerProperty(
            "quantity", Double.class, null, "Quantity (l)", null, null);
    tableWithGeneratedCol.addContainerProperty(
            "price",    Double.class, null, "Price (e/l)",  null, null);
    tableWithGeneratedCol.addContainerProperty(
            "total",    Double.class, null, "Total (e)",    null, null);

    tableWithGeneratedCol.addGeneratedColumn("date", new DateColumnGenerator());
    tableWithGeneratedCol.addGeneratedColumn("quantity", new ValueColumnGenerator("%.2f l"));
    tableWithGeneratedCol.addGeneratedColumn("price", new PriceColumnGeneretor());
    tableWithGeneratedCol.addGeneratedColumn("total",new TotalColumnGenerator("%.2f e", "quantity", "price"));

    // adding some fake rows
    tableWithGeneratedCol.addItem(new Object[] { new GregorianCalendar().getTime(), // date column
                                                 new Double(10),                    // quantity column
                                                 new Double(10),                    // price column
                                                // nothing here                     // total column
                                                }, 1); // itemId
    tableWithGeneratedCol.addItem(new Object[] { new GregorianCalendar().getTime(),
                                                 new Double(16.2),                  // quantity column
                                                 new Double(21.2),                  // price column
                                                // nothing here                     // total column
                                                }, 2); // itemId
    tableWithGeneratedCol.addItem(new Object[] { new GregorianCalendar().getTime(),
                                                 new Double(10),                    // quantity column
                                                 new Double(22),                    // price column
                                                 // nothing here                    // total column                                         
                                                }, 3); // itemId
    tableWithGeneratedCol.addItem(new Object[] { new GregorianCalendar().getTime(),
                                                 new Double(10),                    // quantity column
                                                 new Double(20),                    // price column
                                                 // nothing here                    // total column
                                                }, 4); // itemId
    tableWithGeneratedCol.addItem(new Object[] { new GregorianCalendar().getTime(),
                                                 new Double(15),                    // quantity column
                                                 new Double(19.12),                 // price column

                                                }, 5); // itemId
    tableWithGeneratedCol.addItem(new Object[] { new GregorianCalendar().getTime(),
                                                 new Double(10),                    // quantity column
                                                 new Double(20.30),                 // price column
                                                // nothing here                 // total column     
                                                }, 6); // itemId
    tableWithGeneratedCol.addItem(new Object[] { new GregorianCalendar().getTime(),
                                                 new Double(50),                    // quantity column
                                                 new Double(32.89),                 // price column
                                                 // nothing here                    // total column
                                                }, 7); // itemId

    tableWithGeneratedCol.setVisibleColumns(new Object[] {"date", "quantity", "price", "total"});
    tableWithGeneratedCol.setPageLength(tableWithGeneratedCol.size());
    layout.addComponent(tableWithGeneratedCol);
这是UI的init方法的一个片段。如您所见,我创建了一个包含4列的表,日期、数量、价格和总计,这些列通过乘以数量*价格给出。 我添加了一些伪行,而对于total列,我实际上没有添加任何值,因为它的值应该由数量和价格决定,而创建表行时,这本书并没有告诉您实际是如何做到的,所以我猜测它应该如何工作

下面是Table.ColumnGenerator的实现我使用DateColumnGenerator作为日期列,ValueColumnGenerator作为数量,price ColumnGenerator作为价格列,TotalColumnGenerator作为总计列。因此,按顺序:

日期列生成器:

public class DateColumnGenerator implements ColumnGenerator {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Override
    public Component generateCell(Table source, Object itemId, Object columnId) {
        Property<?> prop = source.getItem(itemId).getItemProperty(columnId);
        if (prop.getType().equals(Date.class)) {
            Date date = (Date) prop.getValue();
            SimpleDateFormat sdf = new SimpleDateFormat("MMM dd, yyyy, HH:mm:ss");
            return new Label(sdf.format(date));
        }
        return null;
    }

}
public class PriceColumnGeneretor implements ColumnGenerator {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Override
    public Component generateCell(Table source, Object itemId, Object columnId) {
        Property<?> prop = source.getItem(itemId).getItemProperty(columnId);
        if (prop.getClass().equals(Double.class)) {
            Double price = (Double) prop.getValue();
            String priceStr = String.format("%.2 €", price);
            return new Label(priceStr);
        }
        return null;
    }

}
public class TotalColumnGenerator implements Table.ColumnGenerator {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    protected String format;
    protected String quantityId;
    protected String priceId;

    public TotalColumnGenerator(String format, String quantityId, String priceId) {
        this.format = format;
        this.quantityId = quantityId;
        this.priceId = priceId;
    }

    @Override
    public Component generateCell(Table source, Object itemId, Object columnId) {
        Double quantity = (Double) source.getItem(itemId).getItemProperty(this.quantityId).getValue();
        Integer price = (Integer) source.getItem(itemId).getItemProperty(this.priceId).getValue();
        String res = String.format(this.format, new Double(quantity * price));

        return new Label(res);
    }

}
但结果是这个漂亮的空表,正如您从屏幕截图中看到的:

现在,我怎样才能真正使这个列生成器工作呢


谢谢大家的关注

不要添加与生成的列同名的属性

这应该足够了

// Generated Table columns
Table tableWithGeneratedCol = new Table();
tableWithGeneratedCol.addGeneratedColumn("date", new DateColumnGenerator());
tableWithGeneratedCol.addGeneratedColumn("quantity", new ValueColumnGenerator("%.2f l"));
tableWithGeneratedCol.addGeneratedColumn("price", new PriceColumnGeneretor());
tableWithGeneratedCol.addGeneratedColumn("total",new TotalColumnGenerator("%.2f e", "quantity", "price"));

// adding some fake rows
tableWithGeneratedCol.addItem(new Object[] { new GregorianCalendar().getTime(), // date column
                                             new Double(10),                    // quantity column
                                             new Double(10),                    // price column
                                            // nothing here                     // total column
                                            }, 1); // itemId
tableWithGeneratedCol.addItem(new Object[] { new GregorianCalendar().getTime(),
                                             new Double(16.2),                  // quantity column
                                             new Double(21.2),                  // price column
                                            // nothing here                     // total column
                                            }, 2); // itemId
tableWithGeneratedCol.addItem(new Object[] { new GregorianCalendar().getTime(),
                                             new Double(10),                    // quantity column
                                             new Double(22),                    // price column
                                             // nothing here                    // total column                                         
                                            }, 3); // itemId
tableWithGeneratedCol.addItem(new Object[] { new GregorianCalendar().getTime(),
                                             new Double(10),                    // quantity column
                                             new Double(20),                    // price column
                                             // nothing here                    // total column
                                            }, 4); // itemId
tableWithGeneratedCol.addItem(new Object[] { new GregorianCalendar().getTime(),
                                             new Double(15),                    // quantity column
                                             new Double(19.12),                 // price column

                                            }, 5); // itemId
tableWithGeneratedCol.addItem(new Object[] { new GregorianCalendar().getTime(),
                                             new Double(10),                    // quantity column
                                             new Double(20.30),                 // price column
                                            // nothing here                 // total column     
                                            }, 6); // itemId
tableWithGeneratedCol.addItem(new Object[] { new GregorianCalendar().getTime(),
                                             new Double(50),                    // quantity column
                                             new Double(32.89),                 // price column
                                             // nothing here                    // total column
                                            }, 7); // itemId

tableWithGeneratedCol.setVisibleColumns(new Object[] {"date", "quantity", "price", "total"});
tableWithGeneratedCol.setPageLength(tableWithGeneratedCol.size());
layout.addComponent(tableWithGeneratedCol);

调用方法addItem时出现问题。若使用ColumnGenerator,请不要将项添加到ColumnGenerator生成的列中。此项必须生成ColumnGenerator。

抱歉@André,我不明白,我没有同名的属性。。。它们在哪里?啊,你的意思是生成的列与添加了addContainerProperty的列属性分离?是因为这个吗?不管怎样,我已经尝试用GeneratedCol.addContainerProperty调用删除所有表,但仍然有一个空表。
// Generated Table columns
Table tableWithGeneratedCol = new Table();
tableWithGeneratedCol.addGeneratedColumn("date", new DateColumnGenerator());
tableWithGeneratedCol.addGeneratedColumn("quantity", new ValueColumnGenerator("%.2f l"));
tableWithGeneratedCol.addGeneratedColumn("price", new PriceColumnGeneretor());
tableWithGeneratedCol.addGeneratedColumn("total",new TotalColumnGenerator("%.2f e", "quantity", "price"));

// adding some fake rows
tableWithGeneratedCol.addItem(new Object[] { new GregorianCalendar().getTime(), // date column
                                             new Double(10),                    // quantity column
                                             new Double(10),                    // price column
                                            // nothing here                     // total column
                                            }, 1); // itemId
tableWithGeneratedCol.addItem(new Object[] { new GregorianCalendar().getTime(),
                                             new Double(16.2),                  // quantity column
                                             new Double(21.2),                  // price column
                                            // nothing here                     // total column
                                            }, 2); // itemId
tableWithGeneratedCol.addItem(new Object[] { new GregorianCalendar().getTime(),
                                             new Double(10),                    // quantity column
                                             new Double(22),                    // price column
                                             // nothing here                    // total column                                         
                                            }, 3); // itemId
tableWithGeneratedCol.addItem(new Object[] { new GregorianCalendar().getTime(),
                                             new Double(10),                    // quantity column
                                             new Double(20),                    // price column
                                             // nothing here                    // total column
                                            }, 4); // itemId
tableWithGeneratedCol.addItem(new Object[] { new GregorianCalendar().getTime(),
                                             new Double(15),                    // quantity column
                                             new Double(19.12),                 // price column

                                            }, 5); // itemId
tableWithGeneratedCol.addItem(new Object[] { new GregorianCalendar().getTime(),
                                             new Double(10),                    // quantity column
                                             new Double(20.30),                 // price column
                                            // nothing here                 // total column     
                                            }, 6); // itemId
tableWithGeneratedCol.addItem(new Object[] { new GregorianCalendar().getTime(),
                                             new Double(50),                    // quantity column
                                             new Double(32.89),                 // price column
                                             // nothing here                    // total column
                                            }, 7); // itemId

tableWithGeneratedCol.setVisibleColumns(new Object[] {"date", "quantity", "price", "total"});
tableWithGeneratedCol.setPageLength(tableWithGeneratedCol.size());
layout.addComponent(tableWithGeneratedCol);