В такой ситуации лучше всего хранить все логи c на главном экране. Если и ваш главный вид, и диалоговое окно обновляют данные независимо друг от друга, очень легко оказаться в ситуации, когда ваши данные противоречивы.
Мое предложение заключается в том, чтобы вы изменили диалоговое окно для запуска сохраненного события при сохранении пользователя и чтобы вы прослушали это событие в главном окне и соответствующим образом обновили его. Таким образом, вы сохраняете состояние просмотра только в одном месте.
public class AddUserDialog extends Dialog {
private void save(Binder<UserDto> binder) {
UserDto userDto = new UserDto();
try {
binder.writeBean(userDto);
fireEvent(new SaveEvent(this, userDto));
} catch (ValidationException e) {
e.printStackTrace();
}
}
public static abstract class UserDialogEvent extends ComponentEvent<AddUserDialog> {
private UserDto userDto;
protected UserDialogEvent(AddUserDialog source, UserDto userDto) {
super(source, false);
this.userDto = userDto;
}
public UserDto getUserDto() {
return userDto;
}
}
public static class SaveEvent extends UserDialogEvent {
public SaveEvent(AddUserDialog source, UserDto userDto) {
super(source, userDto);
}
}
public <T extends ComponentEvent<?>> Registration addListener(Class<T> eventType,
ComponentEventListener<T> listener) {
return getEventBus().addListener(eventType, listener);
}
}
(Вы можете избавиться от абстрактного класса событий, если не видите необходимости в дополнительных событиях, таких как отмена и т. Д. c)
Затем в MainView
прослушайте событие и обновите состояние соответственно.
public class MainView extends VerticalLayout {
private final UserService userService;
private final AddUserDialog addUserDialog;
private Grid<UserDto> grid;
public MainView(UserService userService) {
this.userService = userService;
addUserDialog = new AddUserDialog();
addUserDialog.addListener(AddUserDialog.SaveEvent.class, this::saveUser);
}
@PostConstruct
private void renderComponents() {
renderAddUserButton();
renderUserGrid();
}
private void renderAddUserButton() {
Button addUserButton = new Button("Добавить", VaadinIcon.PLUS.create());
addUserButton.addClickListener(event -> addUserDialog.open());
add(addUserButton);
}
private void renderUserGrid() {
grid = new Grid<>(UserDto.class);
//grid init here
add(grid);
}
private void saveUser(AddUserDialog.SaveEvent saveEvent) {
userService.save(saveEvent.getUserDto());
addUserDialog.close();
refreshGrid();
addUserDialog.addDialogCloseActionListener()
}
private void refreshGrid() {
// refresh grid
}
}