Подтвердить что ты не робот

Диалоговое окно подтверждения 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);
    }

}
4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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