2013-04-23 63 views
0

我正在使用primefaces 3.5,Glassfish 3.1.2和Java EE。我試圖創建一個頁面,在表中創建一個「問題」。我有一個數據表,其中包含用戶在嘗試回答問題時選擇的「答案」。爲什麼我的命令按鈕不工作?

作爲一個選擇題瑣事測驗,他們需要有一個或多個答案是正確的,其餘的都是正確的。我允許每個問題有2-6個答案,並且有多達4個答案。所以我有一個持有答案的p:dataTable元素,並且我有3個commandButtons添加,刪除或編輯表中的答案,每個答案都有一個點擊運行的服務器端方法。但是,沒有任何方法運行。沒有錯誤也沒有例外,只是沒有任何作用。

這裏是我的網頁(我在內的整個頁面,以防萬一我有一個錯誤在其他地方):

<h:form id="createQForm"> 
    <h1>Create A Question</h1> 
    <p:messages id="msgs"/> 
    <p:selectOneMenu 
     value="#{createQuestionBean.selectedCategory}" 
     id="lstCategory" required="true" > 

     <f:selectItems 
      value="#{createQuestionBean.categories}" /> 
     <p:ajax listener="#{createQuestionBean.onSelectCategory}" 
       update="lstSubCategory" /> 
    </p:selectOneMenu> 
    <p:selectOneMenu 
     value="#{createQuestionBean.selectedSubCategory}" 
     id="lstSubCategory" required="false"> 

     <f:selectItem itemLabel="No Sub-Category" 
         noSelectionOption="true" /> 

     <f:selectItems 
      value="#{createQuestionBean.subCategories}"/> 

    </p:selectOneMenu> 
    <h:panelGrid columns="3"> 
     <h:outputLabel for="txtQuestion" id="lblQuestion" value="Question: *" /> 
     <p:inputText value="#{createQuestionBean.entry.question}" 
        id="txtQuestion" required="true" 
        requiredMessage="You must provide a question" 
        validatorMessage="#{createQuestionBean.QUESTION_VALIDATION_MESSAGE}"> 
      <f:validateRegex pattern=".*[\s\d\w]" /> 
      <p:ajax update="msgQuestion" event="keyup" /> 
     </p:inputText> 
     <p:message for="txtQuestion" id="msgQuestion" display="icon"/> 
    </h:panelGrid> 
    <h:outputText value="Horizontal: " /> 

    <p:selectManyCheckbox value="#{createQuestionBean.selectedOptions}"> 
     <f:selectItem itemLabel="Randomizable?" itemValue="randomizable" /> 
     <f:selectItem itemLabel="Multiple Choice?" itemValue="multichoice" /> 
    </p:selectManyCheckbox> 


    <p:fileUpload 
     value="#{createQuestionBean.questionImage}" mode="simple" 
     allowTypes="/(\.|\/)(gif|jpe?g|png)$/" 
     label="Select Images (jpg or png)" 
     sizeLimit="2097152" 
     invalidFileMessage="Sorry, only files of type .jpg, .png or .gif are allowed" 
     invalidSizeMessage="Sorry, files are limited in size to 2 Mb"/> 
    <p:dataTable 
     id="answersTable" var="answer" style="width: 250px" 
     value="#{createQuestionBean.datamodel}" 
     selection="#{createQuestionBean.selectedAnswer}" 
     editMode="cell" editable="true" 
     selectionMode="single"> 

     <p:column style="width:75%"> 
      <p:cellEditor > 
       <f:facet name="output"> 
        <h:outputText 
         value="#{answer.answer.testAnswer}" /> 
       </f:facet> 
       <f:facet name="input"> 
        <p:inputText 
         id="modelInput" 
         style="width: 97%;height: 97%" 
         value="#{answer.answer.testAnswer}"/> 
       </f:facet> 
      </p:cellEditor> 
     </p:column> 
     <p:column style="width:25%"> 
      #{answer.correct ? "Correct" : "Wrong" } 
     </p:column> 

    </p:dataTable> 
    <h:panelGrid columns="3"> 
     <p:commandButton 
      update="answersTable" ajax="true" 
      actionListener="#{createQuestionBean.removeSelect}" 
      value="Remove Selected -"/> 
     <p:commandButton 
      update="answersTable" ajax="true" 
      actionListener="#{createQuestionBean.setAsCorrect}" 
      value="Set Selected As Right"/> 
     <p:commandButton 
      update="answersTable" ajax="true" 
      value="Add +" 
      actionListener="#{createQuestionBean.addAnswer}"/> 

    </h:panelGrid> 
    <p:commandButton 
     action="#{createQuestionBean.saveAndStoreEntry()}" /> 
</h:form> 

下面是被調用的方法:

public void addAnswer() { 
    System.out.println("***** CALLED ADD ANSWER"); 
    answers.add(new QuestionAnswers()); 
    answers.get(answers.size() - 1).setCorrect(false); 
    setIDs(); 
    //set the data models 
    datamodel = new QuestionAnswersDataModel(new ArrayList<QuestionAnswers>(answers)); 
} 

public void removeSelect() { 
    System.out.println("***** CALLED REMOVE SELECT"); 
    if (selectedAnswer == null && !answers.contains(selectedAnswer)) { 
     FacesUtils.addErrorMessage(NO_SELECTION_ERROR); 
    } else { 
     answers.remove(selectedAnswer); 
    } 
    setIDs(); 
    //set the data models 
    datamodel = new QuestionAnswersDataModel(new ArrayList<QuestionAnswers>(answers)); 
} 

public void setAsCorrect() { 
    System.out.println("***** CALLED SET AS CORRECT"); 
    if (selectedAnswer != null) { 
     selectedAnswer.setCorrect(true); 
     if (!entry.getMultichoice()) { 
      for (QuestionAnswers questionAnswers : answers) { 
       if (questionAnswers != selectedAnswer) { 
        questionAnswers.setCorrect(false); 
       } 
      } 
     } 
    } else { 
     FacesUtils.addErrorMessage(NO_SELECTION_ERROR); 
    } 
    setIDs(); 

    //set the data models 
    datamodel = new QuestionAnswersDataModel(new ArrayList<QuestionAnswers>(answers)); 
} 

我在每種方法中添加了斷點以查看是否調用了系統輸出。

我在做什麼錯?我雖然也許是因爲我沒有在方法調用中使用AjaxBehaviourEvent,但這並沒有改變。

回答

0

我發現它是什麼。我刪除了每個元素,並發現它是我的輸入文本框。我刪除了驗證器,但它仍然無效。然後我發現它正在使用實體驗證(IE,它不能爲空或空白),即使我從未說過任何驗證是必需的。一旦我在框中有文本,這些方法就會毫無錯誤地運行。

+0

您是否嘗試使用commandButton的屬性「process =」@ this「' – 2013-04-24 01:24:24

相關問題