1

我有一个包含 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?

有谁知道是否有更好的方法来实现上述表,而不会获得这些疯狂的缓冲区加载时间?

提前致谢!

4

1 回答 1

2

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

不。

从 FieldFactory 返回 null (以及,对于非“Foo”字段)。如果您希望列可编辑,则仅从字段工厂返回一个字段:如果不是,则返回 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;
}

如果这没有产生足够大的差异,那么我将更改工厂以仅为当前选定的行创建字段。

于 2013-09-24T07:37:23.577 回答