我在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>
这是Bean
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函数的问题!!!
答案 0 :(得分:1)
我认为你只有一个问题:你的代码没有调用你的articlesbean.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 panel可能是发生此问题。
如果您在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方法的方法。
请试一试!
答案 1 :(得分:0)
我解决了类似的问题,但我花了将近3天时间才注意到JSF getter必须是真正的getter(再次)。我的意思是tableBean.getData()
提供的列表必须是一个真正的getter提供列表,理想情况下在使用@PostConstruct
注释的void方法中初始化。
JSF将围绕bean生成一个Proxy
类,并且所有代码都反映了表中的更改。您必须只编写实现对更改做出反应的代码(数据库中的持久更改,异步操作,等等......)。
如果“list getter”不是真正的getter并且返回另一个列表(在我的示例中我在原始字段中过滤了列表),则在调用“listener方法”之前所有更改都将丢失 - 它们将被原始文件替换列表。