Обновить сетку из другого интерфейса в Vaadin - PullRequest
0 голосов
/ 24 октября 2019

У меня есть основной макет, который содержит другой пользовательский интерфейс с сеткой и кнопку. Эта сетка показывает данные таблицы моей базы данных. С помощью кнопки открывается мастер, где я могу создать новую запись в этой базе данных. Когда я закрываю мастер нажатием кнопки, я хочу, чтобы сетка обновилась, чтобы показать также вновь добавленную запись. Все работает нормально, включая хранение в моей базе данных, за исключением обновления моей сетки.

Итак, у меня есть пользовательский интерфейс

   public class MainLayout{
   ...
   public void refreshGrid()
   {
      this.grid.getDataProvider().refreshAll();
   }

   }

, где определена моя сетка. Я уже реализовал метод обновления. В нем также есть кнопка для создания новой записи. Когда я нажимаю эту кнопку, вызывается следующий пользовательский интерфейс. Этот пользовательский интерфейс содержит общий макет мастера с панелью вкладок.

public class WizardLayout{
}

На одной из этих вкладок, наконец, есть пользовательский интерфейс с полями ввода для создания записи. Также есть кнопка для сохранения в базе данных.

public class CreateEntry{
...
private void button_onClick(ClickEvent<Button> event)
{
...
}
}

В этом методе нажатия кнопки реализована логика для его сохранения. И после этого я хотел бы вызвать метод refresh из первого пользовательского интерфейса, чтобы обновить его. Как мне это сделать, чтобы он работал?

Пожалуйста, помните, все остальное работает. Поэтому моя единственная проблема - обновить сетку, потому что она не выполняется автоматически. Мне нужно нажать кнопку обновления в моем браузере, чтобы она заработала.

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

Использует ли ваш поставщик данных элементов в памяти , или вы используете ответный провайдер данных с отложенной загрузкой ?

Вы, вероятно, используете провайдер данных в памяти. Это тот случай, когда вы загружаете свои элементы из базы данных и помещаете их в сетку с помощью

grid.setItems(fooService.findAll());

Вызов grid.getDataProvider().refresh() обновит только те элементы, которые уже установлены. Так как у вас есть новый элемент для отображения, вы должны извлечь все элементы снова из БД с вашим сервисом.

grid.setItems(fooService.findAll());
grid.getDataProvider().refreshAll();

Если вы используете провайдер данных обратного вызова с отложенной загрузкой,тогда я думаю, что достаточно просто обновить поставщик данных. Я недостаточно знаю о лениво загруженных поставщиках данных, чтобы решить эту проблему, но я считаю, что эта проблема не должна возникать в первую очередь при использовании обратного поставщика данных

0 голосов
/ 24 октября 2019

Во-первых, обратите внимание, что хотя термин «пользовательский интерфейс» не является неправильным, он может вводить в заблуждение в контексте Vaadin, поскольку он обычно используется для ссылки на объекты Vaadin UI, из которых, как правило, по одному на вкладку. Связь между пользовательскими интерфейсами Vaadin сложнее, чем ваш вариант использования.

Для этого существует множество решений, возможно, проще всего передать экземпляр вашего MainLayout вашему мастеру.

Вв этом случае классы будут тесно связаны, то есть оба будут зависеть друг от друга.

Лучший способ - использовать какой-либо слушатель или обратный вызов. Это может быть довольно сложным, но в простейшем случае вы просто передаете обратный вызов, который будет запущен при сохранении.

WizardLayout.java

private final Runnable saveCallback;

public WizardLayout(Runnable saveCallback) {
    this.saveCallback = saveCallback;
}

private void button_onClick(ClickEvent<Button> event) {
    ...
    saveCallback.run();
}

MainLayout.java

new WizardLayout(this::refreshGrid);
...