在 Vaadin 中打开新对话框时关闭对话框
Closing a dialog when a new one gets opened in Vaadin
我在某个 UI 中创建了一个对话框。
Dialog dialog = new Dialog();
dia.add(new TestView());
dia.open();
新的 UI TestView 包含一个再次创建新对话框的按钮
private void button_onClick(ClickEvent<Button> event {
Dialog dialog = new Dialog();
dia.add(new TestView2());
dia.open();
...
}
如何在创建第二个对话框后关闭第一个对话框?
((Dialog)this.getParent()).close();
不可能。
为了更好地理解:
当UiTwo 创建UiThree 时,我想关闭UiTwo。所以总是只有一个对话框打开。
这对你有用:
public static class CustomDialog extends Dialog {
private Dialog parent;
public CustomDialog(Dialog parent) {
this.parent = parent;
}
@Override
public void open() {
super.open();
if (parent != null) {
parent.close();
}
}
}
// Usage:
public MainView() {
CustomDialog parentDialog = new CustomDialog(null);
parentDialog.add(new Button("Open child", e-> {
CustomDialog childDialog = new CustomDialog(parentDialog);
// set some content to child dialog
childDialog.open();
}));
parentDialog.open();
//...
您的方法实际上是可行的,但请注意 getParen()
returns 是 Optional<Component>
,而不是 Component
。因此,您必须执行以下操作:
getParent().ifPresent(parent -> {
if (parent instanceof Dialog) {
((Dialog) parent).close();
}
});
或者如果你够勇敢
((Dialog) getParent().get()).close();
如果你想按照参考方式去做,这是一种方式:
@Route
public class MainView extends VerticalLayout {
public MainView() {
Dialog dialog = new Dialog();
dialog.add(new DialogView(dialog));
dialog.open();
}
}
还有你的TestView2
public class DialogView extends VerticalLayout {
public DialogView(Dialog dialog) {
Button button = new Button("Next step");
button.addClickListener(e -> {
dialog.close();
Dialog newDialog = new Dialog();
newDialog.add(new Span("You are in the third step"));
newDialog.open();
});
add(button);
}
}
您甚至不必关闭第一个对话框,只需替换内容即可
public class DialogView extends VerticalLayout {
public DialogView(Dialog dialog) {
Button button = new Button("Next step");
button.addClickListener(e -> {
dialog.removeAll();
dialog.add(new Span("You are in the third step"));
});
add(button);
}
}
如果您有许多要像这样循环浏览的视图,我会做一个抽象 class 来实现所有视图之间的通用功能。
我在某个 UI 中创建了一个对话框。
Dialog dialog = new Dialog();
dia.add(new TestView());
dia.open();
新的 UI TestView 包含一个再次创建新对话框的按钮
private void button_onClick(ClickEvent<Button> event {
Dialog dialog = new Dialog();
dia.add(new TestView2());
dia.open();
...
}
如何在创建第二个对话框后关闭第一个对话框?
((Dialog)this.getParent()).close();
不可能。
为了更好地理解:
当UiTwo 创建UiThree 时,我想关闭UiTwo。所以总是只有一个对话框打开。
这对你有用:
public static class CustomDialog extends Dialog {
private Dialog parent;
public CustomDialog(Dialog parent) {
this.parent = parent;
}
@Override
public void open() {
super.open();
if (parent != null) {
parent.close();
}
}
}
// Usage:
public MainView() {
CustomDialog parentDialog = new CustomDialog(null);
parentDialog.add(new Button("Open child", e-> {
CustomDialog childDialog = new CustomDialog(parentDialog);
// set some content to child dialog
childDialog.open();
}));
parentDialog.open();
//...
您的方法实际上是可行的,但请注意 getParen()
returns 是 Optional<Component>
,而不是 Component
。因此,您必须执行以下操作:
getParent().ifPresent(parent -> {
if (parent instanceof Dialog) {
((Dialog) parent).close();
}
});
或者如果你够勇敢
((Dialog) getParent().get()).close();
如果你想按照参考方式去做,这是一种方式:
@Route
public class MainView extends VerticalLayout {
public MainView() {
Dialog dialog = new Dialog();
dialog.add(new DialogView(dialog));
dialog.open();
}
}
还有你的TestView2
public class DialogView extends VerticalLayout {
public DialogView(Dialog dialog) {
Button button = new Button("Next step");
button.addClickListener(e -> {
dialog.close();
Dialog newDialog = new Dialog();
newDialog.add(new Span("You are in the third step"));
newDialog.open();
});
add(button);
}
}
您甚至不必关闭第一个对话框,只需替换内容即可
public class DialogView extends VerticalLayout {
public DialogView(Dialog dialog) {
Button button = new Button("Next step");
button.addClickListener(e -> {
dialog.removeAll();
dialog.add(new Span("You are in the third step"));
});
add(button);
}
}
如果您有许多要像这样循环浏览的视图,我会做一个抽象 class 来实现所有视图之间的通用功能。