我有一个包含15列的表,总共约有4000行。我需要使一些列可编辑,所以我正在使用TableFieldFactory。
问题在于,当我进入编辑模式时,事情的加载速度非常慢。当我向下滚动并且延迟加载加载另一个缓冲区时,在重新绘制表之前最多可能需要20秒。
即使只有一列可编辑,它也会加载得无法忍受。
@Override
public Field<?> createField(Container container, Object itemId, Object propertyId, com.vaadin.ui.Component uiContext) {
TextField tField = (TextField) DefaultFieldFactory.get().createField(container, itemId, propertyId, uiContext);
tField.setImmediate(true);
if (propertyId.equals("Foo") {
return tField;
}
else {
tField.setReadOnly(true);
}
return tField;
}
在一个延迟加载中,加载了大约500-1000行,因此createField()被调用可能是7500-15000次,但这是Vaadin的已知限制还是我做错了什么?也许我不应该首先使用TableFieldFactory,因为有这么多列?
有没有人知道是否有更好的方法来实现上面提到的表,而没有获得这些疯狂的缓冲区加载时间?
提前致谢!
答案 0 :(得分:2)
当您说“一行可编辑”时 - 您是否仍在创建只读字段(如上面的引用代码中所示)?
别。
从FieldFactory返回null(以及非“Foo”字段)。如果希望列可编辑,则只返回Field工厂中的字段:如果不可以,则返回null。
无字段和只读字段之间存在很大差异:没有字段(或字段工厂),Vaadin只会生成一个非常简单的<div>
,没有监听器或其他任何东西。一旦你开始在一个大的Vaadin表中有很多组件,你就会看到某种性能下降。
所以 - 首先,我会将您的现场工厂更改为以下内容。
@Override
public Field<?> createField(Container container, Object itemId, Object propertyId, com.vaadin.ui.Component uiContext) {
if (propertyId.equals("Foo") {
TextField tField = (TextField) DefaultFieldFactory.get().createField(container, itemId, propertyId, uiContext);
tField.setImmediate(true);
return tField;
}
return null;
}
如果这没有产生足够大的差异,我会将工厂更改为仅为当前选定的行创建字段。