2012-08-30 65 views
4

我對Primefaces數據表有問題,特別是對選擇對象。Primefaces數據表選擇對象

在我的下面的代碼中,我總是爲變量「Selected Question」得到Null,這個變量綁定到Datatable with Selection。

如隨後在JSF:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html 
     PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:p="http://primefaces.org/ui" 
     xmlns:ui="http://java.sun.com/jsf/facelets"> 

    <ui:composition template="mainTemplate.xhtml"> 
     <ui:define name="contentTitle">Your Questions</ui:define> 
     <ui:define name="content"> 
      <h:form id="formAllQuestion"> 
       <p:growl id="allQuestionGrowl" showDetail="true"/> 

       <p:dataTable id="allQuestionsTable" var="question" value="#{allQuestionBean.allQuestionDataHelper}" paginator="true" rows="10" 
          selection="#{allQuestionBean.selectedQuestion}" selectionMode="single"> 

        <p:ajax event="rowSelect" listener="#{allQuestionBean.onRowSelect}" update=":formAllQuestion:AnswerToQuestionDialogTable :formAllQuestion:allQuestionGrowl" 
          oncomplete="questDialog.show()"/> 
        <p:ajax event="rowUnselect" listener="#{allQuestionBean.onRowUnselect}" update=":formAllQuestion:allQuestionGrowl"/> 


        <f:facet name="header">Select a Row to display your Question Details</f:facet> 

        <p:column headerText="QuestionID"> 
         #{question.questionId} 
        </p:column> 
        <p:column headerText="Question Name"> 
         #{question.questionName} 
        </p:column> 
        <p:column headerText="Question Description"> 
         #{question.questionText} 
        </p:column> 
        <p:column headerText="Question Short Description"> 
         #{question.questionShortText} 
        </p:column> 
        <p:column headerText="Author"> 
         #{question.professor.profSurename} #{question.professor.profName} 
        </p:column> 
       </p:dataTable> 


       <p:dialog header="Question Details" widgetVar="questionDialog" resizable="true" id="questDialog" 
          showEffect="fade" hideEffect="fade" modal="true"> 
        <p:dataTable id="AnswerToQuestionDialogTable" var="answer" value="#{allQuestionBean.answers}"> 

         <f:facet name="header"> 
          Hier kommt der QR_Code rein! 

          #{allQuestionBean.selectedQuestion.questionId} - #{allQuestionBean.selectedQuestion.questionName} 
         </f:facet> 

         <p:column headerText="Answer"> 
          <h:outputText value="#{answer.answerText}"/> 
         </p:column> 
         <p:column headerText="Counts For this Answer"> 
          <h:outputText value="Bis jetz noch nix!"/> 
         </p:column> 
        </p:dataTable> 
       </p:dialog> 


      </h:form> 
     </ui:define> 
    </ui:composition> 

</html> 

和相關聯的Bean類(AllQuestionBean.class):

@ManagedBean(name = "allQuestionBean") 
    @ViewScoped 
    public class AllQuestionBean implements Serializable { 


    private static final long serialVersionUID = 7038894302985973905L; 

    @ManagedProperty(value = "#{questionDAO}") 
    private QuestionDAO questionDAO; 

    @ManagedProperty(value = "#{profSession.professor}") 
    private Professor professor; 

    @ManagedProperty(value = "#{answerDAO}") 
    private AnswerDAO answerDAO; 

    @ManagedProperty(value = "#{answeredDAO}") 
    private AnsweredDAO answeredDAO; 


    private List<Question> questions; 
    private Question selectedQuestion; 
    private List<Answer> answers; 
    private AllQuestionDataHelper allQuestionDataHelper; 


    public AllQuestionBean(){ 
     System.out.println("Starting Bean: "+this.getClass().getName()); 
    } 

    @PostConstruct 
    public void initVariables(){ 
     questions = questionDAO.readByProfessor(professor); 
    } 

    public void onRowSelect(SelectEvent event) { 



     FacesMessage msg = new FacesMessage("Question Selected", selectedQuestion.getQuestionId()+" -- "+selectedQuestion.getQuestionName()); 

     FacesContext.getCurrentInstance().addMessage(null, msg); 
    } 

    public void onRowUnselect(UnselectEvent event) { 

     FacesMessage msg = new FacesMessage("Question Selected", selectedQuestion.getQuestionId()+" -- "+selectedQuestion.getQuestionName()); 

     FacesContext.getCurrentInstance().addMessage(null, msg); 
    } 


    //---GETTER and SETTER 

    public AllQuestionDataHelper getAllQuestionDataHelper() { 
     allQuestionDataHelper = new AllQuestionDataHelper(questions); 
     return allQuestionDataHelper; 
    } 


    public void setAllQuestionDataHelper(AllQuestionDataHelper allQuestionDataHelper) { 
     this.allQuestionDataHelper = allQuestionDataHelper; 
    } 



    public QuestionDAO getQuestionDAO() { 
     return questionDAO; 
    } 

    public void setQuestionDAO(QuestionDAO questionDAO) { 
     this.questionDAO = questionDAO; 
    } 

    public Professor getProfessor() { 
     return professor; 
    } 

    public void setProfessor(Professor professor) { 
     this.professor = professor; 
    } 

    public AnswerDAO getAnswerDAO() { 
     return answerDAO; 
    } 

    public void setAnswerDAO(AnswerDAO answerDAO) { 
     this.answerDAO = answerDAO; 
    } 

    public AnsweredDAO getAnsweredDAO() { 
     return answeredDAO; 
    } 

    public void setAnsweredDAO(AnsweredDAO answeredDAO) { 
     this.answeredDAO = answeredDAO; 
    } 

    public List<Question> getQuestions() { 
     return questions; 
    } 

    public void setQuestions(List<Question> questions) { 
     this.questions = questions; 
    } 

    public Question getSelectedQuestion() { 
     System.out.println("getSelectedQuestion"); 
     return selectedQuestion; 
    } 

    public void setSelectedQuestion(Question selectedQuestion) { 
     System.out.println("Set selected Question: "+selectedQuestion); 
     this.selectedQuestion = selectedQuestion; 
    } 

    public List<Answer> getAnswers() { 
     answers = answerDAO.getAllAnswersForQuestion(selectedQuestion); 
     return answers; 
    } 

    public void setAnswers(List<Answer> answers) { 
     this.answers = answers; 
    } 
    } 

數據型號名稱:

public class AllQuestionDataHelper extends ListDataModel<Question> implements SelectableDataModel<Question> { 


    public AllQuestionDataHelper() { 
    } 

    public AllQuestionDataHelper(List<Question> list) { 
     super(list); 
    } 

    @Override 
    public Object getRowKey(Question question) { 
     if(!(question == null)){ 
     System.out.println("Your Questions --> Getting RowKey"); 
     System.out.println("RowKey: "+question); 
     System.out.println("RowKey: "+question.getQuestionId()); 
     }else{ 
      System.out.println("Warning Row Key is null"); 
     } 
     return question.getQuestionId(); 
    } 

    @Override 
    public Question getRowData(String rowKey) { 
     System.out.println("Your Questions --> Getting RowData"); 
     System.out.println("RowData: "+rowKey); 

     List<Question> questionList = (List<Question>) getWrappedData(); 

     for(Question q : questionList){ 
      if(rowKey.equals(q.getQuestionId())){ 
       System.out.println("Returning "+q.getQuestionId()); 
       return q; 
      } 
     } 
     return null; 
    } 
} 

我調試幾個運行並提到AllQuestionBean.class中的變量「selectedQuestion」從不設置。會說,「onRowSelect」中的事件變量包含一個NULL對象。如您所見,* .xhtml中有兩個Datatables。第一個將正常加載,沒有問題。 Bean的onClick-Method應該用第二個數據表啓動一個對話框,但是會用一個空指針退出。

對於DataTable中我也跟着教程在Primefaces(http://www.primefaces.org/showcase-labs/ui/datatableRowSelectionInstant.jsf)

+3

您是否需要爲您選擇的數據表使用rowKey? – JamesB

+0

我以爲rowKey來自數據模型。一會兒,我會用模型來源更新這個問題。 – Chris

+0

好的,我用Nullpointer解決了這個問題。它是DataModel類中的getRowData()方法。我試圖等於一個整數字符串,發生在這個時間:)好吧,表現在不會拋出一個Nullpointer,但面臨另一個問題。我只能在桌面上點擊一次。每隔一次點擊對錶格沒有影響。有沒有範圍或與Ajax的問題​​? – Chris

回答

1

使用rowKeyp:dataTable屬性。

rowKey是一個獨特的標識符,可幫助Primefaces引擎根據選擇返回所選對象。

通常,您提供給rowKey屬性的值是POJO的唯一屬性,您將填入p:dataTable

如果您的POJO中沒有任何這種獨特的字段。然後它總是有用的,例如:int rowId;,你可以增加它們並將它們添加到列表中並將它們添加到POJO。