Java GWT对话框生成自身的多个副本

Java GWT对话框生成自身的多个副本,java,gwt,dialog,Java,Gwt,Dialog,下面是两个内部类,当用户单击相应的按钮时,它们会弹出一个简单的对话框。然后,它们更新填充接口上列表框的列表中的值 我注意到,在大多数情况下,对话框似乎会弹出与列表框的当前索引/选定值一样多的副本,但并不总是如此。有时只会弹出一个对话框。有什么想法吗?如果需要,我可以提供更多的代码 public class EditCustomerHandler implements ClickHandler { public EditCustomerHandler() {}

下面是两个内部类,当用户单击相应的按钮时,它们会弹出一个简单的对话框。然后,它们更新填充接口上列表框的列表中的值

我注意到,在大多数情况下,对话框似乎会弹出与列表框的当前索引/选定值一样多的副本,但并不总是如此。有时只会弹出一个对话框。有什么想法吗?如果需要,我可以提供更多的代码

    public class EditCustomerHandler implements ClickHandler {
        public EditCustomerHandler() {}
        public void onClick(ClickEvent event) {

            final DialogBox editCustDialog = new DialogBox();
            editCustDialog.setHTML(customer.getName());

            FlexTable content = new FlexTable();
            FlexTable buttonPanel = new FlexTable();
            final TextBox customerNameTextBox = new TextBox();
            content.setText(0, 0, "Name: ");
            content.setWidget(0, 1, customerNameTextBox);

            Button saveButton = new Button("Save");
            saveButton.addClickHandler(new ClickHandler() {
                public void onClick(ClickEvent event) {
                    if (!customer.getName().equals(customerNameTextBox.getText())) {
                        customer.setName(customerNameTextBox.getText());
                        editCustDialog.hide();
                        stationService.saveCustomer(customer, new DefaultAsyncCallback<String>() {
                            public void onSuccess(String errorCode) {
                                if (errorCode != null) {
                                    MessageBox.showMessage("Error", errorCode);
                                    return;
                                }
                                refreshCusts();

                            }
                        });
                    }
                    }               
            });
            Button cancelButton = new Button("Cancel");
            cancelButton.addClickHandler(new ClickHandler() {
                public void onClick(ClickEvent event) {
                    editCustDialog.hide();                  
                }               
            });

            buttonPanel.setWidget(0, 0, saveButton);
            buttonPanel.setWidget(0,1, cancelButton);
            content.getFlexCellFormatter().setColSpan(1, 0, 2);
            content.getCellFormatter().setHorizontalAlignment(1,0, HasHorizontalAlignment.ALIGN_CENTER);
            content.setWidget(1,0, buttonPanel);
            editCustDialog.add(content);
            editCustDialog.center();
            editCustDialog.setGlassEnabled(true);
            editCustDialog.setModal(false);
            editCustDialog.show();

        }
    }

    public class PlusCustomerHandler implements ClickHandler {
        public PlusCustomerHandler() {}
        public void onClick(ClickEvent event) {
            final DialogBox plusCustDialog = new DialogBox();
            plusCustDialog.center();
            plusCustDialog.setModal(false);
            plusCustDialog.setGlassEnabled(true);
            plusCustDialog.setHTML("New Customer");
            final TextBox customerNameTextBox = new TextBox();
            final FlexTable content = new FlexTable();
            final FlexTable buttonPanel = new FlexTable();
            final Button saveButton = new Button("Save");
            saveButton.addClickHandler(new ClickHandler() {
                public void onClick(ClickEvent event) {
                    if (!customerNameTextBox.getText().equals("")) {
                    SMSCustomer newCustomer = new SMSCustomer();
                    newCustomer.setName(customerNameTextBox.getText());
                    stationService.saveCustomer(newCustomer, new DefaultAsyncCallback<String>() {
                        public void onSuccess(String errorMsg) {
                            if (errorMsg == null) {
                                refreshCusts();
                                plusCustDialog.hide();
                            }
                        }

                    });
}
                    else {
                        MessageBox mb = new MessageBox();
                        mb.showMessage("Yo dawg", "Customers must have names!");

                    }
                    }});

            Button cancelButton = new Button("Cancel");
            cancelButton.addClickHandler(new ClickHandler() {
                public void onClick(ClickEvent event) {
                    plusCustDialog.hide();                  
                }               
            });

            content.setText(0, 0, "Name: ");
            content.setWidget(0, 1, customerNameTextBox);
            buttonPanel.setWidget(0, 0, saveButton);
            buttonPanel.setWidget(0,1, cancelButton);
            content.getFlexCellFormatter().setColSpan(1, 0, 2);
            content.getCellFormatter().setHorizontalAlignment(1,0, HasHorizontalAlignment.ALIGN_CENTER);
            content.setWidget(1,0, buttonPanel);
            plusCustDialog.add(content);


            plusCustDialog.show();
            }
        }
public类EditCustomerHandler实现ClickHandler{
公共编辑器CustomerHandler(){}
公共作废一次点击(点击事件){
最终对话框editCustDialog=新建对话框();
editCustDialog.setHTML(customer.getName());
FlexTable内容=新的FlexTable();
FlexTable buttonPanel=新的FlexTable();
最终文本框customerNameTextBox=新文本框();
setText(0,0,“名称:”);
setWidget(0,1,CustomerMetextBox);
按钮保存按钮=新按钮(“保存”);
saveButton.addClickHandler(新的ClickHandler(){
公共作废一次点击(点击事件){
如果(!customer.getName().equals(customerNameTextBox.getText())){
setName(customerNameTextBox.getText());
editCustDialog.hide();
saveCustomer(客户,新的DefaultAsyncCallback(){
成功时公共无效(字符串错误代码){
如果(错误代码!=null){
MessageBox.showMessage(“错误”,错误代码);
返回;
}
刷新custs();
}
});
}
}               
});
按钮取消按钮=新按钮(“取消”);
cancelButton.addClickHandler(新的ClickHandler(){
公共作废一次点击(点击事件){
editCustDialog.hide();
}               
});
setWidget(0,0,saveButton);
buttonPanel.setWidget(0,1,cancelButton);
getFlexCellFormatter().setColSpan(1,0,2);
content.getCellFormatter().setHorizontalAlignment(1,0,HasHorizontalAlignment.ALIGN_CENTER);
content.setWidget(1,0,buttonPanel);
editCustDialog.add(内容);
editCustDialog.center();
editCustDialog.setGlassEnabled(true);
editCustDialog.setModal(false);
editCustDialog.show();
}
}
公共类PlusCustomerHandler实现ClickHandler{
公共PlusCustomerHandler(){}
公共作废一次点击(点击事件){
最终对话框plusCustomDialog=新建对话框();
plusCustDialog.center();
plusCustDialog.setModal(false);
PlusCustomDialog.setGlassEnabled(true);
plusCustDialog.setHTML(“新客户”);
最终文本框customerNameTextBox=新文本框();
最终FlexTable内容=新FlexTable();
最终FlexTable按钮面板=新FlexTable();
最终按钮保存按钮=新按钮(“保存”);
saveButton.addClickHandler(新的ClickHandler(){
公共作废一次点击(点击事件){
如果(!customerNameTextBox.getText().equals(“”){
SMSCustomer newCustomer=新SMSCustomer();
newCustomer.setName(customerNameTextBox.getText());
saveCustomer(newCustomer,newDefaultAsyncCallback()){
成功时公共无效(字符串errorMsg){
如果(errorMsg==null){
刷新custs();
plusCustDialog.hide();
}
}
});
}
否则{
MessageBox mb=新建MessageBox();
showMessage(“Yo dawg”,“客户必须有名字!”);
}
}});
按钮取消按钮=新按钮(“取消”);
cancelButton.addClickHandler(新的ClickHandler(){
公共作废一次点击(点击事件){
plusCustDialog.hide();
}               
});
setText(0,0,“名称:”);
setWidget(0,1,CustomerMetextBox);
setWidget(0,0,saveButton);
buttonPanel.setWidget(0,1,cancelButton);
getFlexCellFormatter().setColSpan(1,0,2);
content.getCellFormatter().setHorizontalAlignment(1,0,HasHorizontalAlignment.ALIGN_CENTER);
content.setWidget(1,0,buttonPanel);
plusCustDialog.add(内容);
plusCustDialog.show();
}
}

您可以在类的
.onClick()方法中创建一个对话框。请注意,您已将final添加到对话框中,但这并不意味着新的ClickHandler不会多次添加到saveButton和cancelButton中。实际上,每次触发此
.onClick()
方法时,都会生成此对话框

更好的方法是这样的:

DialogBox editCustDialog;

public void onClick(ClickEvent event) {
    if (editCustDialog == null) {
        buildEditCustDialog();
    }
    editCustDialog.show(); // or, editCustDialog.center();
}

private void buildEditCustDialog() {
    editCustDialog = new DialogBox();
    // etc.
}