Important Notice - Forums is archived
To simplify things and help our users to be more productive, we have archived the current forum and focus our efforts on helping developers on Stack Overflow. You can post new questions on Stack Overflow or join our Discord channel.

Vaadin lets you build secure, UX-first PWAs entirely in Java.
Free ebook & tutorial.
Vaadin Grid has addRow missing
Hi,
I am using Vaadin (Version 8) Grid and there is no addRow call?? But the documentation says there is.
What am I missing?
Best.
I also would like to know. My question is how to add an empty row to use with grid editor?
Thx
Same here. There is no addRow or getRows. I do not like the idea of resetting/rebinding the whole grid every time a new row is added or deleted.
It also seem like that Table is gone from Vaadin 8. Table was mature and had lots of functionality that are still missing in grid. Most business applications do not require million rows and Table was just fine.
Would like to know the road map for grid. Should I stick to Vaddin 7 for now?
Thanks in advance.
Grid does not appear to be mature and there is a misalignment between the code base and the documentation. The only way I managed to do an update of a new row is by using the following work around:
// entries is a List<ExampleEntry> that is global and defined previously
entries.add(new ExampleEntry(,,,));
grid.setItems(entries)
but this is not a real solution. I could not get the DataProvider examples to work either since they do not provide an add or delete mechanism and the refresh did not work on them as documented on my sample DataProvider.
All in all, Table should not have been deprecated. There is always a need for a simple and a complex version of something and one ought not remove the simple version without providing an adequate substitution.
Me too also missing the addRow method, I've used this in 7 and really need it back. Anyhelp vaadin ?
I had to add a new empty pojo to my item list and refresh my dataprovider. It works this way.
The problem is I don't have a standard pojo we are trying to generate a grid at runtime that is defined based on a json payload. I'll take any ideas that are available.
Nick Barnes: The problem is I don't have a standard pojo we are trying to generate a grid at runtime that is defined based on a json payload. I'll take any ideas that are available.
Did you find any solution, we got it working, let me know if you are interested to know more.
Hi,
If you don't want to use a POJO, you can just substitute a Map object or similar. Just define your columns with addColumn() to return the values from a Map.
-Olli
Hi Sahil yes please still interested, my kungfu ( java :-) ) is not that great so if you have an example I'd greatly appreciate it. Thanks, I could do this with gird7 but not in 8. Appreciate it
Nick
I wrote this blog post about it earlier. It deals with LocalDates so it's slightly complicated for a basic example, but you should get the idea.
-Olli
Ok, here is what we do:
1- We use a POJO with two fields "id" that contains unique row item identifier and "json" that holds as values in JSON (you could use a map as well instead)
​
public class GridItemBean implements Serializable {
private String id;
private JSONObject json;
public GridItemBean(Object id, JSONObject json) {
this.id = String.valueOf(id);
this.json = json;
}
public String getId() {
return id;
}
public JSONObject getJson() {
return json;
}
So you can create a collection of these items and set it on grid (grid.setItems(....))
----------------------------------------------------------------------------------------------------------------------
2- When adding columns on grid, based on your data type (String/Date/Tmestamp/Double/Integer etc) set an appropriate provider
grid.addColumn(Provider.getProvider(currentView.columns, currentView.types, null));
Here is my provider factory that picks up the appropriate provider:
public class Provider {
@SuppressWarnings("rawtypes")
public static ValueProvider getProvider(String column, Class<?> type, AppField field) {
// Boolean
if (Boolean.class.isAssignableFrom(type)) {
return new BooleanValueProvider(column);
}
// Integer
else if (Integer.class.isAssignableFrom(type)) {
return new IntegerValueProvider(column);
}
// Double
else if (Double.class.isAssignableFrom(type)) {
return new DoubleValueProvider(column);
}
// Date
else if (Date.class.isAssignableFrom(type)) {
return new DateValueProvider(column, field);
}
// Time
else if (Timestamp.class.isAssignableFrom(type)) {
return new TimeValueProvider(column, field);
}
// DateRange
else if (DateRange.class.isAssignableFrom(type)) {
return new DateRangeValueProvider(column);
}
// default to String
else {
return new TextValueProvider(column);
}
}
@SuppressWarnings("rawtypes")
public static ValueProvider getProvider(String column, Class<?> type) {
return getProvider(column, type, null);
}
}
----------------------------------------------------------------------------------------------------------------------
3- Here is a sample Date provider that finds and renders date value from GridItemBean:
public class DateValueProvider implements ValueProvider<GridItemBean, Date> {
private final String column;
private final AppField field;
public DateValueProvider(String column, AppField field) {
super();
this.column = column;
this.field = field;
}
@Override
public Date apply(GridItemBean source) {
if (JSON.hasValue(source.json, column)) {
if (field != null) {
if (field.isProxyField()) {
return new Date(JSON.getLong(source.json, column));
} else {
final JSONObject value = JSON.object(source.json, column);
return new Date(JSON.getLong(value, "start"));
}
} else {
return new Date(JSON.getLong(source.json, column));
}
} else {
return null;
}
}
}
----------------------------------------------------------------------------------------------------------------------
You can also go for a renderer to format the values in grid columns, something that we use extensively but that depends entirely on your needs.
To set a renderer, once you set a provider, you can use;
column.setRenderer(new DateRenderer(dateTime));