2012-10-11 167 views
4

我想我只是在做一些愚蠢的事情,但我無法弄清楚這一點。按鈕:setEnabled(false)不工作?

我正在使用GWT,並且我有一個提交按鈕,其中提交通過REST API向遠程服務器發送一些信息。問題在於,您可以在操作完成時單擊多次提交,並創建多個帖子。

我曾嘗試加入

sendButton.setEnabled(false); 

到單擊處理程序,但它似乎並不奏效。該按鈕保持啓用狀態,並且我仍然可以多次單擊它,並根據需要生成多個帖子。有人可以看到我做錯了什麼嗎?完整的代碼如下。

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


    } 

}

+0

你enabl在任務完成後,再次執行'sendButton'。你確定這個按鈕在執行過程中沒有被禁用嗎? – Baz

回答

3
sendButton.setEnabled(true); 

您在onClick()方法到底有再次enabled你的按鈕..請參閱您單擊處理.. 這可能是問題..

嘗試移動這條線內onSuccess()方法: -

@Override 
public void onSuccess(String result) { 
    processXML(result); 
    sendButton.setEnabled(true); 
} 
+1

爲什麼你總是用「..」而不是「。」? – Baz

+0

@Baz。哈比人:)我的手對我很殘酷。或者說他們現在失控了。 :P –

+0

這樣做。謝謝! – brl8