Vaadin 为什么在编辑模式下,惰性加载在我的表中如此缓慢?

Vaadin 为什么在编辑模式下,惰性加载在我的表中如此缓慢?,vaadin,vaadin7,Vaadin,Vaadin7,我有一个表,共有15列,大约4000行。我需要使一些列可编辑,因此我使用TableFieldFactory进行此操作 问题是,当我进入编辑模式时,加载速度非常慢。当我向下滚动并且延迟加载加载另一个缓冲区时,在重新绘制表之前可能需要20秒 即使只有一列可编辑,它的加载速度也慢得令人无法忍受 @Override public Field<?> createField(Container container, Object itemId, Object propertyId, com.va

我有一个表,共有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;
}
@覆盖
公共字段createField(容器容器、对象项ID、对象属性ID、com.vaadin.ui.Component uiContext){
TextField=(TextField)DefaultFieldFactory.get().createField(容器、itemId、propertyId、uiContext);
tField.setImmediate(true);
如果(属性ID等于(“Foo”){
返回tField;
}
否则{
tField.setReadOnly(true);
}
返回tField;
}
在一次延迟加载中,加载了大约500-1000行,因此createField()可能被调用7500-15000次,但这是Vaadin的已知限制还是我做错了什么?当有这么多列时,也许我不应该首先使用TableFieldFactory

有人知道有没有更好的方法来实现上面提到的表,而不需要这些疯狂的缓冲区加载时间

提前感谢!

当您说“一行可编辑”时,您是否仍在创建只读字段(如上面引用的代码)

不要

从字段工厂返回null(对于非“Foo”字段也返回null)。如果希望列可编辑,则仅从字段工厂返回字段:如果不可编辑,则返回null

无字段和只读字段之间有很大的区别:没有字段(或字段工厂),Vaadin只会生成一个非常简单的
,没有监听器或其他任何东西。一旦在一个大型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;
}
@覆盖
公共字段createField(容器容器、对象项ID、对象属性ID、com.vaadin.ui.Component uiContext){
如果(属性ID等于(“Foo”){
TextField=(TextField)DefaultFieldFactory.get().createField(容器、itemId、propertyId、uiContext);
tField.setImmediate(true);
返回tField;
}
返回null;
}

如果这还不够大,我会将工厂更改为只为当前选定的行创建字段。

对不起,我是指列,而不是行。我认为答案仍然有效。只读字段!=完全没有字段!你完全正确。我刚刚尝试了这一点,它变得更好了,但唉,因为我在t中添加了可编辑列表的渲染速度变慢了。我的表中总共需要7个可编辑列,其中两个是DateFields。现在每个缓冲区加载5个TextField列的时间大约为5秒,这是一个改进,但单独加载两个DateField列至少需要相同的时间,所以每个缓冲区的加载时间至少为10秒,return在每个不可编辑的字段上输入null。因此,接下来的问题将是-我现在是否正在尝试从Vaadin表性能方面合理地期望什么,我实现事情的方式?如果是这样,您的答案完全有效!我自己-我一次只为一行(即所选行)生成字段,如我昨天的示例所示。对于每个延迟加载500-1000行,您仍然在谈论同时连接到DOM的7x500(或1000)=3500-7000个字段。这太多了,无法执行。