在 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 来实现所有视图之间的通用功能。