Reputation: 646
I think I am just doing something stupid but I can't figure this one out.
I am using GWT, and I have a submit button where submit sends some information to a remote server via a REST API. The problem is, you can click submit multiple times while the operation is completing, and multiple posts are made.
I have tried adding
sendButton.setEnabled(false);
to the click handler, but it does not seem to be working. The button remains enabled and I can still click it as many times as I want resulting in multiple posts. Can someone see what I am doing wrong? Complete code below.
public class HelpDeskTest implements EntryPoint {
private final HelpDeskTestServiceAsync helpDeskTest= GWT.create (HelpDeskTestService.class);
final Button sendButton = new Button("Submit");
final TextBox nameField = new TextBox();
final Label errorLabel = new Label();
final TextBox subjectField = new TextBox();
final TextArea descriptionField= new TextArea();
/**
* This is the entry point method.
*/
public void onModuleLoad() {
// We can add style names to widgets
//sendButton.addStyleName("sendButton");
// Add the nameField and sendButton to the RootPanel
// Use RootPanel.get() to get the entire body element
RootPanel.get("nameFieldContainer").add(nameField);
RootPanel.get("subjectFieldContainer").add(subjectField);
RootPanel.get("descriptionFieldContainer").add(descriptionField);
RootPanel.get("sendButtonContainer").add(sendButton);
RootPanel.get("errorLabelContainer").add(errorLabel);
//set name field text
nameField.setText("GWT User");
// Focus the cursor on the name field when the app loads
subjectField.setFocus(true);
subjectField.selectAll();
//set widths and heights
descriptionField.setWidth("100%");
descriptionField.setHeight("200px");
nameField.setWidth("100%");
subjectField.setWidth("100%");
//click handler
sendButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
sendButton.setEnabled(false);
String uName = nameField.getText();
String subject = subjectField.getText();
String desc = descriptionField.getText();
String newURLp1 = "http://xxx.xx.xx/sdpapi/request?" +
"OPERATION_NAME=ADD_REQUEST&TECHNICIAN_KEY=D4xxxxxxxB6" +
"&INPUT_DATA=<?xml version=";
String urlp2 = "%221.0%22";
String urlp3 = " encoding=";
String urlp4 = "%22utf-8%22";
String urlp5 = "?><Operation><Details><requester>" + uName + "</requester><subject>" + subject +
"</subject><description>" + desc + "</description></Details></Operation>";
String encUrl = URL.encode(newURLp1) + urlp2 + URL.encode(urlp3) + urlp4 + URL.encode(urlp5);
System.out.println(encUrl);
helpDeskTest.postToRemoteServer(encUrl,
new AsyncCallback<String>() {
@Override
public void onFailure(Throwable caught) {
Window.alert("Failure getting XML through proxy");
}
@Override
public void onSuccess(String result) {
processXML(result);
}
});
sendButton.setEnabled(true);
}
});
}
public void processXML(final String xml) {
try {
Document doc = XMLParser.parse(xml);
// get the status using Node's getNodeValue() function - this will determine success or failure.
String status = doc.getElementsByTagName("status").item(0).getFirstChild().getNodeValue();
//if success:
if (status.equals("Success")) {
String statCode = doc.getElementsByTagName("statuscode").item(0).getFirstChild().getNodeValue();
String msg = doc.getElementsByTagName("message").item(0).getFirstChild().getNodeValue();
String woid = doc.getElementsByTagName("workorderid").item(0).getFirstChild().getNodeValue();
System.out.println("Result from HelpDesk:");
System.out.println("Status Code: " + statCode);
System.out.println("Status: " + status);
System.out.println(msg);
System.out.println(msg + ". Ticket Number is: " + woid);
errorLabel.setText(msg + ". Ticket Number is: " + woid);
} else if (status.equals("Failed")){
//get message
String failmsg = doc.getElementsByTagName("message").item(0).getFirstChild().getNodeValue();
errorLabel.setText(failmsg);
}
}
catch ( Exception e ) {
e.printStackTrace();
}
}
}
Upvotes: 7
Views: 19509
Reputation: 213401
sendButton.setEnabled(true);
You have enabled
your button again at the end of the onClick()
method.. See your click handler..
This might be the problem..
Try moving this line inside onSuccess()
method: -
@Override
public void onSuccess(String result) {
processXML(result);
sendButton.setEnabled(true);
}
Upvotes: 5