Spring Vaadin 8网格不再具有Grid.addRow(obj)

Spring Vaadin 8网格不再具有Grid.addRow(obj),spring,vaadin,vaadin-grid,Spring,Vaadin,Vaadin Grid,我最近收到了一个Vaadin7项目,之前的开发人员使用Vaadin7GridGrid.addRow(obj)将行添加到网格中。现在在Vaadin 8网格中,添加了Grid.setItems(?Collection?),这将完全清除Grid.setItems()上网格中的数据。我看了所有来自Vaadin的YouTube视频和所有堆栈溢出页面,没有找到答案 我确实发现这个论坛有一群人有同样的问题: 这是我的作品,我并不为此感到骄傲。基本上,在我的示例中添加一个ArrayList会使用一个名为fir

我最近收到了一个Vaadin7项目,之前的开发人员使用Vaadin7GridGrid.addRow(obj)将行添加到网格中。现在在Vaadin 8网格中,添加了Grid.setItems(?Collection?),这将完全清除Grid.setItems()上网格中的数据。我看了所有来自Vaadin的YouTube视频和所有堆栈溢出页面,没有找到答案

我确实发现这个论坛有一群人有同样的问题:

这是我的作品,我并不为此感到骄傲。基本上,在我的示例中添加一个ArrayList会使用一个名为firstName、lastName、email和salary的Person类

@SpringUI(path = "/person")
@Theme("valo")
public class PersonForm extends UI{

    @Autowired
    PersonService personService;
    List<Person> entries = new ArrayList<Person>();
    private TextField firstName = new TextField("First Name");
    private TextField lastName = new TextField("Last Name");
    private TextField email  = new TextField("Email Address");
    private TextField salary  = new TextField("Salary");
    private Person person = new Person();
    private Grid<Person> grid = new Grid<>(Person.class);
    final private FormLayout layout = new FormLayout();

    @Override
    protected void init(VaadinRequest request){

        grid.getEditor().isEnabled();
        grid.setColumnOrder("firstName", "lastName",
                "email", "salary");

        layout.addComponent(firstName);
        layout.addComponent(lastName);
        layout.addComponent(email);
        Button save = new Button("Save", e-> {

            addPersonToGrid(new Person(firstName.getValue(), lastName.getValue(), email.getValue(),salary.getValue()));

            Notification.show("PERSON WAS SAVED");
        });

        layout.addComponent(save);
        layout.addComponent(grid);
        layout.setMargin(true);
        setContent(layout);

    }

    public void addPersonToGrid(Person person){
        entries.add(person);
        grid.setItems(entries);
    }
}
@SpringUI(path=“/person”)
@主题(“valo”)
公共类PersonForm扩展UI{
@自动连线
人情服务人情服务;
列表项=新的ArrayList();
私有TextField firstName=新TextField(“firstName”);
私有TextField lastName=新TextField(“姓氏”);
私人TextField email=新TextField(“电子邮件地址”);
私有文本字段工资=新文本字段(“工资”);
私人=新人();
私有网格=新网格(Person.class);
最终私有FormLayout布局=新FormLayout();
@凌驾
受保护的void init(VaadinRequest请求){
grid.getEditor().isEnabled();
grid.setColumnOrder(“firstName”、“lastName”,
“电子邮件”、“工资”);
layout.addComponent(名字);
layout.addComponent(lastName);
布局。添加组件(电子邮件);
按钮保存=新建按钮(“保存”,e->{
addPersonToGrid(新人(firstName.getValue()、lastName.getValue()、email.getValue()、salary.getValue());
通知。显示(“人员已保存”);
});
布局。添加组件(保存);
布局。添加组件(网格);
布局。设置页边距(真);
设置内容(布局);
}
公共void addPersonToGrid(个人){
条目。添加(人);
网格设置项(条目);
}
}

您是正确的,因为在Vaadin8中不再有addRow/addBean方法。 但是,您可以使用非常整洁的数据提供者,而不是使用旧的BeanItemContainer。现在可以直接在数据提供程序上设置筛选器和排序器

使用这样的数据提供程序会更容易:

private ListDataProvider<Person> provider = ListDataProvider.ofCollection(entries);

@Override
protected void init(VaadinRequest request){
  grid.setDataProvider(provider);
  ........
}

public void addPersonToGrid(Person person){
    entries.add(person);
    provider.refreshAll();
}

public void editPersonToGrid(int idx, Person person){
    entries.set(idx, person);
    provider.refreshItem(person);
}
private ListDataProvider provider=ListDataProvider.of Collection(条目);
@凌驾
受保护的void init(VaadinRequest请求){
grid.setDataProvider(provider);
........
}
公共void addPersonToGrid(个人){
条目。添加(人);
provider.refreshAll();
}
公共无效editPersonToGrid(int idx,个人){
条目集(idx,个人);
提供者。刷新项目(人);
}

它不像只调用条目那么简单。添加(person)和自动处理的所有其他内容,但它适用于大型数据集,如果您使用过滤器和排序,它将非常方便。

非常有效,谢谢!