2012-09-08 508 views
0

我正在使用primefaces 3.3,在頁面上有3個組件:數據表,編輯區,命令按鈕。我有一個奇怪的問題:當我打開頁面時,數據顯示在數據表中,但是如果我點擊任何一個按鈕,調試器會提示相應的按鈕代碼甚至沒有被調用。但是,如果我點擊表中的任何記錄,編輯區域將被填充,然後如果我點擊按鈕,他們就開始工作。 下面是頁面代碼,我試過不同的選項,把所有的內容放在1表格等等,沒有作品。請幫助JSF DataTable命令按鈕不起作用

<ui:define name="content"> 
     <h:form id="form" prependId="false"> 
      <p:growl id="growl" showDetail="true"/> 
      <p:dataTable id="table" var="var" 
         value="#{regions.list}" 
         selection="#{regions.selected}" 
         rowKey="#{var.idRegion}" 
         selectionMode="single" 
         paginator="true" rows="10" 
         paginatorPosition="bottom"         
         >         
       <p:ajax event="rowSelect" listener="#{regions.onRowSelect}" update=":frmEdit :form:growl" /> 
       <p:ajax event="rowUnselect" listener="#{regions.onRowUnSelect}" update=":frmEdit :form:growl"/> 

       <f:facet name="header"> 
        List of Regions 
       </f:facet> 
       <p:column sortBy ="#{var.shortName}"> 
        <f:facet name="header">Short Name</f:facet> 
        <h:outputText value="#{var.shortName}" /> 
       </p:column> 
       <p:column sortBy ="#{var.fullName}"> 
        <f:facet name="header">Full Name</f:facet> 
        <h:outputText value="#{var.fullName}" /> 
       </p:column> 
       <p:column sortBy ="#{var.created}"> 
        <f:facet name="header">Created On</f:facet> 
        <h:outputText value="#{var.created}" /> 
       </p:column> 
      </p:dataTable> 
          </h:form> 
      <p:panel header="Add/Edit Properties"> 
     <h:form id="frmEdit"> 
       <h:panelGrid id="display" columns="6" cellpadding="4" > 

        <h:outputText value="Short Name:" /> 
        <h:inputText value="#{regions.selected.shortName}" /> 

        <h:outputText value="Full Name:" /> 
        <h:inputText value="#{regions.selected.fullName}" /> 

       </h:panelGrid> 
     </h:form> 
     <h:form id="frmBtn"> 
       <h:panelGrid id="command" columns="6" cellpadding="4" > 
        <p:commandButton id="new" value="New" actionListener="#{regions.add()}" process="@this :frmEdit" update="result :frmEdit :form" >         
        </p:commandButton> 
        <p:commandButton id="save" value="Save" actionListener="#{regions.save()}" process="@this :frmEdit" update="result :frmEdit :form" >         
        </p:commandButton> 
        <p:commandButton id="delete" value="Delete" actionListener="#{regions.delete()}" process="@this :frmEdit" update="result :frmEdit :form" >         
        </p:commandButton> 
        <p:commandButton id="refresh" value="Refresh" actionListener="#{regions.refresh()}" process="@this :frmEdit" update="result :frmEdit :form" >         
        </p:commandButton> 
       </h:panelGrid> 

       <p:messages id="result" showDetail="true" autoUpdate="true"/> 
     </h:form> 
      </p:panel> 
    </ui:define> 

下面是JSF MB代碼:

@ManagedBean 
@ViewScoped 
public class Regions implements Serializable { 
    private List<Region> list; 
    private Region selected; 
    private @EJB RegionFacade esvc; //entity services  
    private FacesContext context; 
    private FacesMessage msg; 
    private boolean newRec =false; 

    @SuppressWarnings("OverridableMethodCallInConstructor") 
    public Regions() { 
//  context = FacesContext.getCurrentInstance(); 
//  HttpSession session = (HttpSession)context.getExternalContext().getSession(false); 
//  Users user = (Users)session.getAttribute("user"); 
//  if (user != null) 
//   init(); 
//  else { 
//   msg = new FacesMessage("Session Expired, Return to Login Page"); 
//   context.addMessage(null, msg); 
//  } 
    } 

    @PostConstruct 
    public void init(){   
     try{ 
      list = esvc.findAll(); 
     }catch (Exception ex){ 
      System.out.println(ex); 
     } 
    } 

    public String add(){ 
     selected = new Region();   
     newRec = true; 
     return "region"; 
    } 

    public String save(){ 
     int result; 
     if (newRec){ 
      result=esvc.insert(selected); 
      newRec=false; 
     } 
     else{  
      result=esvc.update(selected); 
     } 
     refresh(); 
     context = FacesContext.getCurrentInstance(); 
     if (result>0){ 
      msg = new FacesMessage(FacesMessage.SEVERITY_INFO,"Success", "Record Saved"); 
      refresh(); 
     }else{ 
      msg = new FacesMessage(FacesMessage.SEVERITY_INFO,"Failure", "Record not Saved");    
     } 
     context.addMessage(null, msg); 
     return "region"; 
    } 

    public String delete(){ 
     int result; 
     result= esvc.delete(selected); 
     context = FacesContext.getCurrentInstance(); 
     refresh(); 
     if (result>0){ 
      msg = new FacesMessage(FacesMessage.SEVERITY_INFO,"Success", "Record Deleted");    
      refresh(); 
     }else { 
      msg = new FacesMessage(FacesMessage.SEVERITY_INFO,"Failure", "Record not Deleted");    
     } 
     context.addMessage(null, msg); 
     return "region"; 
    } 

    public void refresh(){ 
     selected=null; 
     list=getList();   
    } 

    public List<Region> getList() { 
     return list; 
    } 

    public Region getSelected() { 
     return selected; 
    } 

    public void setSelected(Region selected) { 
     this.selected = selected; 
    } 

    public void onRowSelect(SelectEvent event) { 
     context = FacesContext.getCurrentInstance(); 
     msg = new FacesMessage("Selected", ((Region) event.getObject()).getFullName()); 
     context.addMessage(null, msg); 
    } 


    public void onRowUnSelect(UnselectEvent event) { 
     context = FacesContext.getCurrentInstance(); 
     selected=null; 
    }  

} 
+0

爲什麼你有一個單獨的窗體給你按鈕? –

回答

0

ActionListener方法(對actionListener屬性就像你有使用)必須採取ActionEvent參數和void返回類型。如果要保留方法簽名,請刪除命令按鈕上的actionListener屬性並使用action屬性。但是,如果您需要立即處理事件,則會在按鈕上觸發事件,您必須更改方法簽名才能完成ActionListenerinterface