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