0

我在 JEE 项目中使用 Primeface 4.0、JSF 2 和 jpa,我在单元格编辑中使用了 Primefaces 展示数据表中显示的示例。这是HTML代码

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
               xmlns:ui="http://java.sun.com/jsf/facelets"
               xmlns:f="http://java.sun.com/jsf/core"
               xmlns:h="http://java.sun.com/jsf/html"
               xmlns:rich="http://richfaces.org/rich"
               xmlns:a4j="http://richfaces.org/a4j"
               xmlns:p="http://primefaces.org/ui"
               xmlns:c="http://java.sun.com/jsp/jstl/core"
               template="/WEB-INF/templates/default.xhtml">


<ui:define name="content">
<center>






 <rich:panel  style="width : 800px; height : 551px; " > 
     <f:facet name="header" >

<h:outputText value="Tableau des articles" align="center" style="FONT-SIZE: small;"/>
            </f:facet>


    <h:form id="form">
  <p:growl id="messages" showDetail="true"/>  

    <p:contextMenu for="cars" widgetVar="cMenu">     
        <p:menuitem value="Edit Cell" icon="ui-icon-search" onclick="PF('carsTable').showCellEditor();return false;"/>    
        <p:menuitem value="Hide Menu" icon="ui-icon-close" onclick="PF('cMenu').hide()"/>    
    </p:contextMenu>  

   <p:dataTable id="cars" var="car" value="#{articlesbean.LMatpilotaccess1}" editable="true" editMode="cell" widgetVar="carsTable">  

        <f:facet name="header">  
            Matériel du pilotage et accessoires 
        </f:facet>  


  <p:ajax event="cellEdit" listenner="#{articlesbean.onCellEdit()}" update=":form:messages" /> 
        <p:column headerText="Serie" style="width:25%">                

               <p:cellEditor>  
                   <f:facet name="output"><h:outputText value="#{car.serie}" /></f:facet>  
                   <f:facet name="input"><p:inputText id="modelInput" value="#{car.serie}" style="width:96%"/></f:facet>  
               </p:cellEditor>  
           </p:column>  





           <p:column headerText="Prix unitaire HTVA" style="width:25%">               

               <p:cellEditor>  
                   <f:facet name="output"><h:outputText value="#{car.puhtva}" /></f:facet>  
                   <f:facet name="input"><p:inputText id="modelInput5" value="#{car.puhtva}" style="width:96%"/></f:facet>  
               </p:cellEditor>  
           </p:column>





            <p:column headerText="Montant HTVA" style="width:25%">               

               <p:cellEditor>  
                   <f:facet name="output"><h:outputText value="#{car.monthtva}" /></f:facet>  
                   <f:facet name="input"><p:inputText id="modelInput8" value="#{car.monthtva}" style="width:96%"/></f:facet>  
               </p:cellEditor>  
           </p:column>

            <p:column headerText="Montant TTC" style="width:25%">               

               <p:cellEditor>  
                   <f:facet name="output"><h:outputText value="#{car.montttc}" /></f:facet>  
                   <f:facet name="input"><p:inputText id="modelInput9" value="#{car.montttc}" style="width:96%"/></f:facet>  
               </p:cellEditor>  
           </p:column>

    </p:dataTable>  


    </h:form>




</rich:panel>






</center>
</ui:define>



</ui:composition>

这就是豆子

package com.pfe.controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;

import org.primefaces.component.datatable.DataTable;
import org.primefaces.event.CellEditEvent;



import com.pfe.data.ArticlesDAO;
import com.pfe.model.Matpilotaccess1;
import com.pfe.model.Matpilotaccess2;
import com.pfe.model.Poteaux;
import com.pfe.model.Travgc1;
import com.pfe.model.Travgc2;
import com.pfe.model.Travresurbain;

@ManagedBean(name="articlesbean")

@ViewScoped
public class ArticlesBean implements Serializable{

    @Inject
    private ArticlesDAO articleDAO;
    @Inject
    private Matpilotaccess1 matpilotaccess1;
    @Inject
    private Matpilotaccess2 matpilotaccess2;
    @Inject
    private Poteaux poteaux ;
    @Inject
    private Travgc1 travgc1;
    @Inject
    private Travgc2 travgc2;
    @Inject
    private Travresurbain travresurbain;


    private List LMatpilotaccess1 = new ArrayList();
    private List LMatpilotaccess2 = new ArrayList();
    private List LPoteaux = new ArrayList();
    private List LTravgc1 = new ArrayList();
    private List LTravgc2 = new ArrayList();
    private List LTravresurbain = new ArrayList();




    public void onCellEdit(CellEditEvent event) {  
        Object oldValue = event.getOldValue();  
        Object newValue = event.getNewValue();  
          System.out.println("////////////////////////);
        if(newValue != null && !newValue.equals(oldValue)) {  

            DataTable s = (DataTable) event.getSource();
            Matpilotaccess1 d = (Matpilotaccess1) s.getRowData();

            articleDAO.Updatetable(d);
              System.out.println("///////////////////");
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Cell Changed", "Old: " + oldValue + ", New:" + newValue);  
            FacesContext.getCurrentInstance().addMessage(null, msg);  
        }  
    } ///// getters and setters 

这里的问题是,甚至 ////////////// 都没有显示,这意味着 HTML 代码中存在阻止执行 onCellEdit 函数的问题!!!

4

2 回答 2

1

我认为您只有一个问题:您的代码没有调用您的文章bean.onCellEdit() 方法。

这是我的简单工作正常(但我没有将richfaces组件与primefaces混合):

<h:form id="testForm">
            <p:growl id="messages" showDetail="true"/>
            <p:outputPanel id="testContainer">
            <p:dataTable id="testTable" value="#{tableBean.data}" var="entry" editable="true" editMode="cell">

                    <p:ajax event="cellEdit" listener="#{tableBean.onCellEdit}" process="@this" update=":testForm:messages"/>
(...)

用户在表格中编辑后,该消息正确显示。请尝试将richfaces 面板替换为primefaces 面板,可能会出现此问题。

如果您在 p:ajax 中有一些更新问题,您可以使用RemoteCommand。但在这种情况下,您需要重新设计articlesbean 中的方法以:

public void onCellEdit() {
//do some thing

和 xhtml:

<p:remoteCommand name="onCellEdit" action="#{articlesbean.onCellEdit()}" update=":form:messages" />
<p:dataTable id="cars" var="car" value="#{articlesbean.LMatpilotaccess1}" editable="true" editMode="cell" widgetVar="carsTable">  

        (...)

  <p:ajax event="cellEdit" oncomplete="onCellEdit()" /> 

RemoteCommand 提供了一种直接从 javascript 执行 JSF 支持 bean 方法的方法。

请试一试!

于 2013-11-14T16:25:02.483 回答
1

我解决了类似的问题,但我花了将近 3 天的时间才注意到 JSF 的吸气剂必须是真正的吸气剂(再次)。我的意思是,由 提供的列表tableBean.getData()必须是一个真正的 getter 提供列表,该列表在 void 方法中理想地初始化,并用@PostConstruct. JSF 将围绕 bean 生成一个Proxy类和所有代码以反映表中的变化。您只需编写实现对更改做出反应的操作的代码(数据库中的持久更改、异步操作等)。

如果“list getter”不是真正的 getter 并返回另一个列表(在我的示例中,我过滤了原始字段中的列表),则在调用“listener method”之前所有更改都将丢失 - 它们被原始列表替换。

于 2018-05-14T14:24:20.727 回答