【问题标题】:Update a Vaadin Grid programmatically以编程方式更新 Vaadin Grid
【发布时间】:2019-09-26 13:20:58
【问题描述】:

我正在尝试使用 Vaadin 14 创建一个网格,该网格由调用下面的 updateFieldByName 方法的事件处理程序更新。但是,网格永远不会刷新。

我想要实现的只是这个:

    aaa 1
    bbb 2

updateFieldByName("aaa", "ok");

    aaa ok
    bbb 2

我尝试过使用 grid.setItems(properties) 和 grid.setDataProvider(dataProvider),但表格只是不想更新。

List<Property> properties = Arrays.asList(new Property("aaa", "1"), new Property("bbb", "2"));
ListDataProvider<Property> dataProvider = DataProvider.ofCollection(properties);

Grid<Property> grid = new Grid<>(Property.class);
grid.setDataProvider(dataProvider);

private void updateFieldByName(final String name, final String value) {
    properties.stream().filter((o) -> o.getName().equals(name)).forEach((p) -> {
        p.setValue(value);
        dataProvider.refreshAll();
    });
}

public static class Property {
    private String name;
    private String value;

    public Property(final String name) {
        this(name, "-");
    }

    public Property(final String name, final String value) {
        super();
        this.name = name;
        this.value = value;
    }

    public String getName() {
        return name;
    }

    public void setName(final String name) {
        this.name = name;
    }

    public String getValue() {
        return value;
    }

    public void setValue(final String value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return "[" + name + " = " + value + "]";
    }

}

【问题讨论】:

  • 不确定这是否或为什么会有所不同,但您可以尝试在流之外的 refreshAll 吗?
  • 其实当你不添加/删除项目时,调用 refreshItem(item) 来改变项目就足够了。我还想问一下,为什么你的 bean 使用静态类?

标签: java vaadin


【解决方案1】:

您是如何准确调用updateFieldByName 方法的?我添加了一个 TextField,我在其中输入了一个 aaa,在调用 ValueChangeEvent 之后,网格会正确更新。

这是我正在使用的代码。 (我为Property 类创建了一个单独的类)

import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.data.provider.DataProvider;
import com.vaadin.flow.data.provider.ListDataProvider;
import com.vaadin.flow.router.Route;

import java.util.Arrays;
import java.util.List;

@Route("gridSO")
public class GridUpdateSO extends VerticalLayout {

    List<Property> properties = Arrays.asList(new Property("aaa", "1"), new Property("bbb", "2"));
    ListDataProvider<Property> dataProvider = DataProvider.ofCollection(properties);
    public GridUpdateSO() {
        Grid<Property> grid = new Grid<>(Property.class);
        grid.setDataProvider(dataProvider);
        add(grid);
        TextField ab=new TextField("TextField", e->{
            updateFieldByName(e.getValue(),"ok");

        });
        add(ab);
    }
        private void updateFieldByName(final String name, final String value) {
            properties.stream().filter((o) -> o.getName().equals(name)).forEach((p) -> {
                p.setValue(value);
                dataProvider.refreshAll();
            });
        }
    }

Property.java

public class Property {
    private String name;
    private String value;

    public Property(final String name) {
        this(name, "-");
    }

    public Property(final String name, final String value) {
        super();
        this.name = name;
        this.value = value;
    }

    public String getName() {
        return name;
    }

    public void setName(final String name) {
        this.name = name;
    }

    public String getValue() {
        return value;
    }

    public void setValue(final String value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return "[" + name + " = " + value + "]";
    }
}

【讨论】:

  • 感谢您的回答。 UI 部署在 Karaf 环境中。该事件是从由 AsyncEventBus 处理的另一个包接收的。因此,该问题似乎涉及线程问题。我也尝试使用文本字段来达到同样的效果。 setValue 方法运行,但 UI 不更新。当我点击一个按钮时,尽管没有听众在场,但 UI 会更新。
  • 那么我建议创建一个独立的示例并将其提交到 Github repo,因为根据您的描述,这似乎是一个错误
  • 或者您可以尝试将问题发布到 Vaadin 论坛
  • 虽然我无法通过事件处理程序使页面正常工作,但我能够使用此处描述的以下方法解决此问题:vaadin.com/docs/flow/advanced/tutorial-push-access.html。 (将事件值存储在类中,线程休眠然后每秒调用 ui.access(...)。
猜你喜欢
  • 2015-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-25
  • 2015-06-30
  • 2018-01-18
  • 2021-06-22
  • 1970-01-01
相关资源
最近更新 更多