Диалоговое окно подтверждения GWT

Я пытаюсь создать модальное диалоговое окно подтверждения. Я хотел бы, чтобы это работало как Window.confirm(""), где я могу просто назвать его и получить булев ответ.

Моя проблема, я не уверен, как сделать это. Я пытаюсь использовать MVP в своем приложении. Вот код, который я имею до сих пор:

public class DialogBoxPresenter implements Presenter {

    public interface Display {

        Label getDialogText();

        Button getAffirmativeButton();

        Button getCancelButton();

        Widget asWidget();

        public void center();

        public void hide();

        public void setHeader(String text);
    }
    private Display display;
    private String header;
    private String dialogText;
    private String cancelButtonText;
    private String affirmativeButtonText;

    protected DialogBoxPresenter() {
    }

    public DialogBoxPresenter(Display display, String header, String dialogText, String cancelButtonText, String affirmativeButtonText) {
        this.display = display;
        this.header = header;
        this.dialogText = dialogText;
        this.cancelButtonText = cancelButtonText;
        this.affirmativeButtonText = affirmativeButtonText;

        bind();
    }

    public DialogBoxPresenter(Display display, String header, String dialogText) {
        this.display = display;
        this.header = header;
        this.dialogText = dialogText;
        this.cancelButtonText = "Cancel";
        this.affirmativeButtonText = "OK";

        bind();
    }

    private void bind() {

        this.display.getDialogText().setText(dialogText);
        this.display.getAffirmativeButton().setText(affirmativeButtonText);
        this.display.getCancelButton().setText(cancelButtonText);
        this.display.setHeader(header);

        addClickHandlers();

    }

    private void addClickHandlers() {
        this.display.getAffirmativeButton().addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                doAffirmative();
            }
        });

        this.display.getCancelButton().addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                doCancel();
            }
        });
    }

    private void doAffirmative() {
        //do something
        display.hide();
    }

    private void doCancel() {
        //do something
        display.hide();
    }

    public void init() {
        display.center();
    }

    @Override
    public void go(HasWidgets container) {
        container.clear();
        container.add(display.asWidget());
    }
}

и мое представление:

public class DialogBoxView extends DialogBox implements DialogBoxPresenter.Display {

    private Label dialogText;
    private Button affirmativeButton;
    private Button cancelButton;
    private VerticalPanel container;

    public DialogBoxView() {
        //init items
        dialogText = new Label();

        affirmativeButton = new Button();
        cancelButton = new Button();

        container = new VerticalPanel();

        setGlassEnabled(true);
        setAnimationEnabled(true);
        setModal(false);

        init();
    }

    private void init() {
        //add items
        container.add(dialogText);

        HorizontalPanel hp = new HorizontalPanel();
        hp.add(affirmativeButton);
        hp.add(cancelButton);

        container.add(hp);
        this.add(container);
    }

    @Override
    public Widget asWidget() {
        return this;
    }

    @Override
    public Label getDialogText() {
       return dialogText;
    }

    @Override
    public Button getAffirmativeButton() {
        return affirmativeButton;
    }

    @Override
    public Button getCancelButton() {
       return cancelButton;
    }

    @Override
    public void setHeader(String text) {
       this.setText(text);
    }

}
12
задан Igor Klimer 2 July 2010 в 20:55
поделиться

2 ответа

Вы не сможете заставить его работать точно так же, как Window.confirm () . Проблема в том, что весь javascript на веб-странице выполняется в одном потоке. Вы заметите, что пока открыт стандартный диалог подтверждения, остальная часть страницы не работает. Это потому, что один поток javascript заблокирован, ожидая возврата confirm () . Если бы вы создали аналогичный метод для своего диалога, пока он ждал, пока этот метод не вернет, никакие события, созданные пользователем, не будут обрабатываться, и поэтому ваш диалог не будет работать. Я надеюсь, что в этом есть смысл.

Лучшее, что вы сможете сделать, аналогично тому, что делает библиотека GWT для вызовов RPC - интерфейс AsyncCallback . Вы даже можете повторно использовать этот интерфейс самостоятельно или можете предпочесть использовать свой собственный:

public interface DialogCallback {
    void onOk();
    void onCancel();
}

Вместо Window.confirm (String) подпись вашего метода будет больше похожа на Dialog.confirm (String , DialogCallback) . Затем ваш диалог просто сохраняет ссылку на переданный обратный вызов, и там, где у вас есть // что-то в вашем коде, вы вызываете onOk и onCancel .

19
ответ дан 2 December 2019 в 05:39
поделиться

Вот код, который у меня работает, если кому-то интересно.

    public class DialogBoxPresenter implements Presenter {

        public interface Display {

            Label getDialogText();

            Button getAffirmativeButton();

            Button getCancelButton();

            Widget asWidget();

            public void center();

            public void hide();

            public void setHeader(String text);
        }
        private Display display;
        private String header;
        private String dialogText;
        private String cancelButtonText;
        private String affirmativeButtonText;
        private ConfirmDialogCallback confirmCallback;
        private AlertDialogCallback alertCallback;

        protected DialogBoxPresenter() {
        }

        public DialogBoxPresenter(Display display, String header, String dialogText, String cancelButtonText, String affirmativeButtonText, ConfirmDialogCallback callback) {
            this.display = display;
            this.header = header;
            this.dialogText = dialogText;
            this.cancelButtonText = cancelButtonText;
            this.affirmativeButtonText = affirmativeButtonText;
            this.confirmCallback = callback;

            bind();
        }

        public DialogBoxPresenter(Display display, String header, String dialogText, String affirmativeButtonText, AlertDialogCallback callback) {
            this.display = display;
            this.header = header;
            this.dialogText = dialogText;
            this.affirmativeButtonText = affirmativeButtonText;
            this.alertCallback = callback;

            this.display.getCancelButton().setVisible(false);

            bind();
        }

        private void bind() {

            this.display.getDialogText().setText(dialogText);
            this.display.getAffirmativeButton().setText(affirmativeButtonText);
            this.display.getCancelButton().setText(cancelButtonText);
            this.display.setHeader(header);

            addClickHandlers();

        }

        private void addClickHandlers() {
            this.display.getAffirmativeButton().addClickHandler(new ClickHandler() {

                @Override
                public void onClick(ClickEvent event) {
                    doAffirmative();
                }
            });

            this.display.getCancelButton().addClickHandler(new ClickHandler() {

                @Override
                public void onClick(ClickEvent event) {
                    doCancel();
                }
            });
        }

        private void doAffirmative() {
            if (confirmCallback != null) {
                confirmCallback.onAffirmative();
            } else {
                alertCallback.onAffirmative();
            }
            display.hide();
        }

        private void doCancel() {
            confirmCallback.onCancel();
            display.hide();
        }

        public void init() {
            display.center();
        }

        @Override
        public void go(HasWidgets container) {
            container.clear();
            container.add(display.asWidget());
        }
    }




    public class DialogBoxView extends DialogBox implements DialogBoxPresenter.Display {

        private Label dialogText;
        private Button affirmativeButton;
        private Button cancelButton;
        private VerticalPanel container;

        public DialogBoxView() {
            //init items
            dialogText = new Label();

            affirmativeButton = new Button();
            cancelButton = new Button();

            container = new VerticalPanel();

            setGlassEnabled(true);
            setAnimationEnabled(true);
            setModal(false);

            init();
        }

        private void init() {
            //add items
            container.add(dialogText);

            HorizontalPanel hp = new HorizontalPanel();
            hp.add(affirmativeButton);
            hp.add(cancelButton);

            container.add(hp);
            this.add(container);
        }

        @Override
        public Widget asWidget() {
            return this;
        }

        @Override
        public Label getDialogText() {
           return dialogText;
        }

        @Override
        public Button getAffirmativeButton() {
            return affirmativeButton;
        }

        @Override
        public Button getCancelButton() {
           return cancelButton;
        }

        @Override
        public void setHeader(String text) {
           this.setText(text);
        }

    }


    public class DialogBoxWidget implements LensooConstant {

        private static DialogBoxView view = null;
        private static DialogBoxPresenter presenter = null;

        public static DialogBoxPresenter confirm(String header, String dialogText, String cancelButtonText, String affirmativeButtonText, ConfirmDialogCallback callback) {
            view = new DialogBoxView();
            presenter = new DialogBoxPresenter(view, header, dialogText, cancelButtonText, affirmativeButtonText, callback);

            presenter.init();

            return presenter;
        }

        public static DialogBoxPresenter confirm(String header, String dialogText, ConfirmDialogCallback callback) {
            return DialogBoxWidget.confirm(header, dialogText, constants.cancelButton(), constants.okButton(), callback);
        }

        public static DialogBoxPresenter alert(String header, String dialogText, String affirmativeButtonText, AlertDialogCallback callback) {
            view = new DialogBoxView();
            presenter = new DialogBoxPresenter(view, header, dialogText, affirmativeButtonText, callback);

            presenter.init();

            return presenter;
        }

        public static DialogBoxPresenter alert(String header, String dialogText, AlertDialogCallback callback) {
            return DialogBoxWidget.alert(header, dialogText, constants.okButton(), callback);
        }

        protected DialogBoxWidget() {
        }
    }

public interface AlertDialogCallback {

    void onAffirmative();

}

public interface ConfirmDialogCallback {

    void onAffirmative();

    void onCancel();
}
8
ответ дан 2 December 2019 в 05:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: