gpt4 book ai didi

java - Vaadin 14 网格 + 对话框 : How to refresh grid after closing dialog?

转载 作者:行者123 更新时间:2023-11-30 01:42:04 27 4
gpt4 key购买 nike

我使用 Vaadin 14。我有一个网格向用户展示。另外,我有一个按钮来创建和保存新用户。我的 MainGrid 如下所示:

public class MainView extends VerticalLayout {

private final UserService userService;
private final AddUserDialog addUserDialog;
private Grid<UserDto> grid;

public MainView(UserService userService,
AddUserDialog addUserDialog) {
this.userService = userService;
this.addUserDialog = addUserDialog;
}

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

对话框如下所示:

public class AddUserDialog extends Dialog {
private final UserService userService;

public AddUserDialog(UserService userService) {
this.userService = userService;
}
@PostConstruct
public void init() {
//init form here
}
private void save(Binder<UserDto> binder) {
UserDto userDto = new UserDto();
try {
binder.writeBean(userDto);
} catch (ValidationException e) {
e.printStackTrace();
}
userService.save(userDto);
this.close();
}
}

请问,关闭对话框后如何刷新网格?

最佳答案

在这种情况下,最好将所有逻辑保留在主视图中。如果您的主视图和对话框都独立更新数据,则很容易出现数据不一致的情况。

我的建议是,您更改对话框以在保存用户时触发已保存事件,并在主视图中监听该事件并相应地更新它。这样,您只需将 View 状态维护在一处。

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

(如果您不需要取消等其他事件,则可以删除抽象事件类)

然后,在 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
}
}

关于java - Vaadin 14 网格 + 对话框 : How to refresh grid after closing dialog?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59603904/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com