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.
}