GWT确认对话框
我正在尝试创建一个模式确认对话框。我希望它像GWT确认对话框,gwt,Gwt,我正在尝试创建一个模式确认对话框。我希望它像窗口一样工作。确认(“”),在这里我可以调用它,并得到一个布尔响应 我的问题是我不知道怎么做。我正在尝试在我的应用程序中使用MVP。以下是我目前掌握的代码: public class DialogBoxPresenter implements Presenter { public interface Display { Label getDialogText(); Button getAffirmative
窗口一样工作。确认(“”
),在这里我可以调用它,并得到一个布尔响应
我的问题是我不知道怎么做。我正在尝试在我的应用程序中使用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);
}
}
您将无法让它以与
Window.confirm()完全相同的方式工作。问题是网页中的所有javascript都在一个线程中运行。您会注意到,只要打开一个标准的确认对话框,页面的其余部分就会消失。这是因为一个javascript线程被阻塞,等待confirm()
返回。如果要为对话框创建类似的方法,只要等待该方法返回,就不会处理用户生成的事件,因此对话框将无法工作。我希望这是有道理的
您所能做的最好的事情与GWT库为RPC调用所做的事情类似--AsyncCallback
接口。您甚至可以自己重新使用该接口,或者您可能更愿意使用自己的接口:
public interface DialogCallback {
void onOk();
void onCancel();
}
方法签名将更像是对话框.confirm(字符串,DialogCallback)
,而不是窗口.confirm(字符串,DialogCallback)
。然后,您的对话框只保留对传入的回调的引用,在代码中有//do something
,您可以调用onOk
和onCancel
如果有人好奇,这里是我正在使用的代码
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();
}
这很有效。谢谢你,先生。我将在另一个答案中为好奇的人发布我的代码。Lensoo常数是什么?谢谢。哦,对不起。我不知道我把它忘在那里了。它只是一个包含字符串常量的接口,用于不同的语言支持。这是一种愚蠢的实现方式,后来又被改变了。MVP简单的好例子!如何测试演示者和小部件?