Vaadin 8 Grid больше не имеет grid.addRow (obj)

Недавно мне передали проект Vaadin 7, в котором предыдущий разработчик использовал Vaadin 7 Grid grid.addRow (obj) для добавления строк в сетку. Теперь в Vaadin 8 Grid добавлены grid.setItems (? Collection?), Которые полностью стирают данные в Grid на grid.setItems (). Я просмотрел все видео на YouTube с Vaadin и все страницы переполнения стека и не нашел ответа.

Я нашел этот форум с группой людей, у которых была такая же проблема: https://vaadin.com/forum#!/thread/15724440

Вот моя работа, и я ею не горжусь. В основном добавление ArrayList в моем примере использует класс Person с firstName, lastName, электронной почтой и зарплатой.

@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);
    }
}

person Dan Hargis    schedule 07.07.2017    source источник


Ответы (1)


Вы правы в том, что в Vaadin8 больше нет метода addRow / addBean. Однако вы можете работать с DataProvider, который очень удобен, вместо использования старого BeanItemContainer. Теперь вы можете установить фильтры и SortOrders прямо в DataProvider.

Было бы проще использовать DataProvider следующим образом:

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);
}

Это не так удобно, как простой вызов Entry.add (person) и все остальное обрабатывается автоматически, но он работает с большими наборами данных и очень удобен, если вы используете фильтры и сортировку.

person Manuel Kollegger    schedule 10.07.2017
comment
Работает Спасибо! - person Dan Hargis; 11.07.2017