Закрытие диалога при открытии нового в Vaadin - PullRequest
0 голосов
/ 15 октября 2019

Я создал диалог в определенном пользовательском интерфейсе.

Dialog dialog = new Dialog();
dia.add(new TestView());
dia.open();

Новый пользовательский интерфейс TestView содержит кнопку, которая снова создает новый диалог

private void button_onClick(ClickEvent<Button> event {
    Dialog dialog = new Dialog();
    dia.add(new TestView2());
    dia.open();
    ...
}

Как закрыть первый диалогкогда будет создан второй?

((Dialog)this.getParent()).close(); невозможно.

Для лучшего понимания: image

Когда UiTwo создает UiThree, яхочу, чтобы UiTwo был закрыт. Чтобы всегда был открыт только один диалог.

Ответы [ 2 ]

1 голос
/ 15 октября 2019

Это возможно при вашем подходе, но учтите, что getParen() возвращает 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);
    }
}

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

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

Это может работать для вас:

    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();
        //...
...