rowEdit primefaces não funciona ao clicar

Estou com um pequeno problema no rowEdit (<p: rowEdit />) do primefaces. Problema esse que aparece a grid certinha e a coluna de opções, só que ao clicar no icone do lápis ele não chama nem faz ação alguma, ou seja, não mostra a opção de alterar e excluir. Sendo assim estou com esse problema e se alguem tiver a solução de também salvar no banco (na qual vi muitas duvidas) e poder dar essa força também agradeço. Segue o meu código xhtml:

<h:form id="form">

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

    <p:dataTable var="produto" value="#{produtoBean.listProduto}" id="produtoList" editable="true">

        <f:facet name="header">
            In-Cell Editing
        </f:facet>

        <p:column headerText="Nome" style="width:325px">
            <p:cellEditor>
                <f:facet name="output">
                    <h:outputText value="#{produto.descricao}" />
                </f:facet>
                <f:facet name="input">
                    <p:inputText value="#{produto.descricao}" style="width:100%"/>
                </f:facet>
            </p:cellEditor>
        </p:column>

        <p:column headerText="Unidade" style="width:125px">
            <p:cellEditor>
                <f:facet name="output">
                    <h:outputText value="#{produto.unidade.descricao}" />
                </f:facet>
                <f:facet name="input">
                    <p:inputText value="#{produto.unidade.descricao}" style="width:100%" label="Year"/>
                </f:facet>
            </p:cellEditor>
        </p:column>

        <p:column headerText="Opções" style="width:50px">
            <p:rowEditor />
        </p:column>

    </p:dataTable>

</h:form>

Quem poder me dar uma luz, desde já agradeço.

Ola acacio qual versão do primefaces está usando porque a que estou usando 2.2 não tem este atributo editable na datatable, vi que la na pagina do primecafes colocaram editable = true, tenta retirar para ver o que acontece.

Eu retirei o “editTable=true” e continua da mesma forma, ao clicar não aparece as opções.

A versão do prime faces que estou usando é a 3.1

Na versão 3.1 não tem o atributo editable mesmo, deixa sem!

Dá uma olhada no console de erros do navegador, verifica se ta passando pelo construtor do seu bean quando acessa esta pagina.

Se puder coloca o seu ManagedBean para darmos uma olhada

O bean:

public class ProdutoBean implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @EJB
    private ProdutoService produtoService;
    
    @EJB
    private UnidadeMedidaService unidadeService;
    
    private List<Produto> listProduto;
    private Produto produto;
    private String descricao;
    private long unidade;
    private float kg;
    private boolean editaDados;	
    private boolean mostraMensagemGeral;
    private boolean mostraMensagemEditaDados;
    private boolean update;
    private String mensagemHeader;
    private String mensagemFooter;
    private String MENSAGEM_HEADER_GERAL = FacesUtil.getMessageByKey("produto.panel.header.geral");
    private String MENSAGEM_HEADER_CADASTRO_INCLUSAO = FacesUtil.getMessageByKey("produto.panel.header.cadastro.inclusao");
    private String MENSAGEM_HEADER_CADASTRO_ALTERACAO = FacesUtil.getMessageByKey("produto.panel.header.cadastro.alteracao");
    
    private DataTable binDataTable = new DataTable();
    
    public ProdutoBean() {
    }
    
    @PostConstruct
    public void init() {        
        this.editaDados = false;
        this.mostraMensagemGeral = false;
        this.mostraMensagemEditaDados = false;
        this.mensagemHeader = this.MENSAGEM_HEADER_GERAL;
        this.mensagemFooter = MensagemConstants.MENSAGEM_GERAL_PANEL_FOOTER_GERAL;
        this.load();
    }
    
    private void load() {
        this.listProduto = produtoService.findAll("p.descricao"); 
    }
    
    public void incluir() {		
        this.mostraMensagemGeral = false;
        this.mostraMensagemEditaDados = false;
        this.mensagemHeader = this.MENSAGEM_HEADER_CADASTRO_INCLUSAO;
        this.mensagemFooter = MensagemConstants.MENSAGEM_GERAL_CAMPO_OBRIGATORIO_FORMULARIO;
        this.editaDados = true;
        this.kg = 0;
        this.descricao = null;        
        this.unidade = 0;
        this.update = false;
    }
    
    public void editar() {
        this.update = false;
        this.mostraMensagemGeral = false;
        this.mostraMensagemEditaDados = false;
        this.mensagemHeader = this.MENSAGEM_HEADER_CADASTRO_ALTERACAO;
        this.mensagemFooter = MensagemConstants.MENSAGEM_GERAL_CAMPO_OBRIGATORIO_FORMULARIO;
        if (this.produto != null) {
            this.editaDados = true;
            this.kg = this.produto.getKg();
            this.descricao = this.produto.getDescricao();
            this.unidade = this.produto.getUnidade().getId();
            this.update = true;
        }
    }
    
    public void cancelar() {
        this.produto = null;
        this.editaDados = false;
        this.mostraMensagemGeral = false;
        this.mostraMensagemEditaDados = false;
        this.mensagemHeader = this.MENSAGEM_HEADER_GERAL;
        this.mensagemFooter = MensagemConstants.MENSAGEM_GERAL_PANEL_FOOTER_GERAL;
    }
    
    public void voltar() {
        this.cancelar();
    }
    
    public void salvar() {
        this.mostraMensagemGeral = false;
        this.mostraMensagemEditaDados = false;
        
        try {
      		
            boolean temErro = false;
            
            if (ValidadorUtil.isNullOrEmpty(this.descricao)) {
                FacesUtil.addError(null, "geral.campo.obrigatorio", FacesUtil.getMessageByKey("produto.descricao"));
                FacesUtil.addError("inpDescricao", "geral.campo.obrigatorio.resumido");
                temErro = true;
            }
            
            if (this.unidade == 0) {
                FacesUtil.addError(null, "geral.campo.obrigatorio", FacesUtil.getMessageByKey("produto.unidadeMedida"));
                FacesUtil.addError("inpUnidade", "geral.campo.obrigatorio.resumido");
                temErro = true;
            }
            
            if (this.kg == 0) {
                FacesUtil.addError(null, "geral.campo.obrigatorio", FacesUtil.getMessageByKey("produto.kg"));
                FacesUtil.addError("inpKg", "geral.campo.obrigatorio.resumido");
                temErro = true;
            }
                        
            if (!temErro) {
                if (!this.update) {
                    this.produto = new Produto();
                }
                
                this.produto.setKg(this.kg);
                this.produto.setDescricao(this.descricao.trim());
                this.produto.setUnidade(unidadeService.findById(this.unidade));
                this.produto = produtoService.salvar(this.produto);
                this.load();
                this.editaDados = false;
                this.mostraMensagemGeral = true;
                this.mostraMensagemEditaDados = false;
                this.mensagemHeader = this.MENSAGEM_HEADER_GERAL;
                this.mensagemFooter = MensagemConstants.MENSAGEM_GERAL_PANEL_FOOTER_GERAL;
                FacesUtil.addSucessMessage(null, "registro.gravado.sucesso", this.descricao);
            }
            else {
                this.mostraMensagemGeral = false;
                this.mostraMensagemEditaDados = true;
            }
        }
        catch (Exception e) {
            FacesUtil.addError(null, "erro.descricao", e.toString());
            this.mostraMensagemGeral = false;
            this.mostraMensagemEditaDados = true;
        }
    }
    
    public void remover() {
        this.mostraMensagemGeral = true;
        this.mostraMensagemEditaDados = false;
        try {
            String auxNome = this.produto.getDescricao();
            produtoService.remover(this.produto);
            this.load();
            FacesUtil.addSucessMessage(null, "registro.removido.sucesso", auxNome);            
        }
        catch (Exception e) {
            FacesUtil.addError(null, "erro.descricao", e.toString());            
        }
    }

    public List<Produto> getListProduto() {
        return listProduto;
    }

    public Produto getProduto() {
        return produto;
    }

    public void setProduto(Produto produto) {
        this.produto = produto;
    }

    public String getNome() {
        return descricao;
    }

    public void setNome(String nome) {
        this.descricao = nome;
    }

    public long getUnidade() {
        return unidade;
    }

    public void setUnidade(long unidade) {
        this.unidade = unidade;
    }
    
    public boolean isEditaDados() {
        return editaDados;
    }

    public boolean isMostraMensagemEditaDados() {
        return mostraMensagemEditaDados;
    }

    public boolean isMostraMensagemGeral() {
        return mostraMensagemGeral;
    }

    public String getMensagemHeader() {
        return mensagemHeader;
    }

    public String getMensagemFooter() {
        return mensagemFooter;
    }

    public DataTable getBinDataTable() {
        return binDataTable;
    }

    public void setBinDataTable(DataTable binDataTable) {
        this.binDataTable = binDataTable;
    }

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public float getKg() {
		return kg;
	}

	public void setKg(float kg) {
		this.kg = kg;
	}    
}

Nesse tempinho fiquei fazendo varios testes, e acho que sei mais ou menos onde esta o erro. Tentarei alinhar a situação:

  1. O form do in-cell está dentro de outro form, sendo assim não funciona;
  2. Quando eu coloco o form in-cell para fora, funciona beleza, clico no botão aparece os campos e os botões de salvar e excluir;
  3. Só que eu quero que apareça somente na pagina de cadastro, local onde não está funcionando.
  4. Sendo que eu quero colocar somente em cadastro, mas não sei como, por possuir só um xhtml.

Incluirei aqui todo o xhtml da página:

<?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"       
	  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="/templates/default.xhtml">
        <ui:param name="titulo" value="#{msg['cotacoes.panel.header.geral']}"/>
        <ui:define name="conteudo">   
			<p:outputPanel id="opPrincipal" autoUpdate="false">
                <p:panel id="pnlPrincipal"                      
                         header="#{cotacoesBean.mensagemHeader}" 
                         footer="#{cotacoesBean.mensagemFooter}">          	
        			<h:form id="frmUnidadeEditaDados" prependId="false">
                        <p:outputPanel id="opEditaDados"								   
                                       rendered="#{cotacoesBean.editaDados}">
                            <p:messages id="msgEditaDados" 
                                        rendered="#{cotacoesBean.mostraMensagemEditaDados}"
                                        globalOnly="true"/>                            
                            <h:panelGrid id="pgUnidade"
                                         styleClass="panelGrid"
                                         columns="2"
                                         cellpadding="3"
                                         cellspacing="3"
                                         columnClasses="columnLabel10,columnInput90">
                                
                                
                                <h:outputLabel value="* #{msg['cotacoes.horario']}:"/>
                                <h:panelGroup>
                                  	<h:outputScript name="locale-primefaces.js" library="js" /> 
                                  	<p:calendar locale="pt_BR"  value="#{cotacoesBean.horario}" id="popupCal" navigator="true" pattern="dd/MM/yyyy HH:mm:ss"/>
                                 		<p:dialog id="inpHorario" header="Selected Dates" widgetVar="dialog"   
            										showEffect="fade" hideEffect="fade"> 
            										<h:outputText value="Popup Date:" />  
            										<h:outputText value="#{cotacoesBean.horario}" id="popupDate">  
                										<f:convertDateTime pattern="dd/MM/yyyy HH:mm:ss"/>  
            										</h:outputText> 
            							</p:dialog>           
                                 <p:message for="inpHorario" display="text"/>                                                                        
                                </h:panelGroup>
       
                                <h:panelGroup/>
                                <h:panelGroup>                                		
                                        <p:commandButton id="btnSalvar"
                                                         icon="ui-icon-disk"
                                                         value="#{msg['button.salvar']}"
                                                         title="#{msg['button.salvar.title']}"
                                                         accesskey="#{msg['button.salvar.accesskey']}"
                                                         onclick="jQuery(this).attr('disabled', true);"
                                                         oncomplete="jQuery(this).attr('disabled', false); jQuery('#dtUnidade\\:clmHorario_filter').focus();jQuery('#inpHorario').focus();"
                                                         action="#{cotacoesBean.salvar}"
                                                         styleClass="button100"
                                                         update=":opPrincipal"/>
                                        <span style="padding-left:3px;"/>
                                        <p:commandButton id="btnCancelar"
                                                         icon="ui-icon-cancel"
                                                         value="#{msg['button.cancelar']}"
                                                         title="#{msg['button.cancelar.title']}"
                                                         accesskey="#{msg['button.cancelar.accesskey']}"
                                                         oncomplete="jQuery('#dtUnidade\\:clmHorario_filter').focus();"
                                                         action="#{cotacoesBean.cancelar}"
                                                         styleClass="button100"
                                                         update=":opPrincipal"/>
                                </h:panelGroup>
                                
                                <!-- inicio de teste in-cell -->
                              
  <h:form id="form">
    <p:growl id="messages" showDetail="true"/>
    <p:dataTable var="produto" value="#{produtoBean.listProduto}" id="produtoList">
        <f:facet name="header">
            In-Cell Editing
        </f:facet>

        <p:column headerText="Nome" style="width:325px">
            <p:cellEditor>
                <f:facet name="output">
                    <h:outputText value="#{produto.descricao}" />
                </f:facet>
                <f:facet name="input">
                    <p:inputText value="#{produto.descricao}" style="width:100%"/>
                </f:facet>
            </p:cellEditor>
        </p:column>

        <p:column headerText="Unidade" style="width:125px">
            <p:cellEditor>
                <f:facet name="output">
                    <h:outputText value="#{produto.unidade.descricao}" />
                </f:facet>
                <f:facet name="input">
                    <p:inputText value="#{produto.unidade.descricao}" style="width:100%" label="Year"/>
                </f:facet>
            </p:cellEditor>
        </p:column>

        <p:column headerText="Opções" style="width:50px">
            <p:rowEditor />
        </p:column>

    </p:dataTable>
</h:form>		
	
                                 <!-- fim de teste in-cell -->
                                
                            </h:panelGrid>
                        </p:outputPanel>				
                    </h:form>
                    <h:form id="frmUnidadeGeral" prependId="false">                        
                        <p:outputPanel id="opGeral"                                       
                                       rendered="#{!cotacoesBean.editaDados}">
                            <p:messages id="msgGeral" rendered="#{cotacoesBean.mostraMensagemGeral}"/>
                            <h:panelGrid styleClass="panelGridBarraFerramenta100"
                                         cellpadding="0"
                                         cellspacing="0"
                                         columns="2"
                                         columnClasses="panelGridColumnLeft50,panelGridColumnRight50">
                                <p:commandButton id="btnNovoSuperior"
                                                 icon="ui-icon-document"
                                                 value="#{msg['button.novo']}"
                                                 title="#{msg['button.novo.title']}"
                                                 accesskey="#{msg['button.novo.accesskey']}"
                                                 oncomplete="jQuery('#inpHorario').focus();"
                                                 action="#{cotacoesBean.incluir}"
                                                 styleClass="button100"
                                                 update=":opPrincipal"/>
                                <p:commandButton id="btnRecarregarSuperior"
                                                 icon="ui-icon-arrowrefresh-1-e"
                                                 value="#{msg['button.recarregar']}"
                                                 title="#{msg['button.recarregar.title']}"
                                                 accesskey="#{msg['button.recarregar.accesskey']}"
                                                 onclick="jQuery('#dtUnidade\\:clmHorario_filter').attr('value', '');
                                                          jQuery('#dtUnidade\\:clmHorario_filter').attr('value', '');"
                                                 oncomplete="jQuery('#dtUnidade\\:clmHorario_filter').focus();"
                                                 action="#{cotacoesBean.init}"
                                                 styleClass="button100"/>
                            </h:panelGrid>
                            <p:dataTable id="dtUnidade"
                                         style="padding-top:10px;padding-bottom:10px;"								 
                                         styleClass="dataTable"
                                         var="cotacoes"
                                         value="#{cotacoesBean.listUnidade}"
                                         paginator="true"							 
                                         paginatorTemplate="#{cfg['dataTable.paginatorTemplate']}"
                                         currentPageReportTemplate="#{cfg['dataTable.currentPageReportTemplate']}"									 
                                         rows="20"
                                         rowsPerPageTemplate="#{cfg['dataTable.rowsPerPageTemplate']}"									 
                                         rowStyleClass="#{empty rowId or rowId mod 2 ne 0 ? 'evenRow' : 'oddRow'}"
                                         rowIndexVar="rowId"
                                         emptyMessage="#{msg['datatable.empty']}">
                                <p:column id="clmEditar"
                                		  styleClass="dtCotacoesAcao">
                                        <p:commandLink id="lnkEditar"
                                        			   title="#{msg['button.editar.title']}"                                                       
                                                       oncomplete="jQuery('#inpHorario').focus();"
                                                       action="#{cotacoesBean.editar}"
                                                       update=":opPrincipal">
                                            <p:graphicImage value="/resources/imagens/editar.png"/>
                                            <f:setPropertyActionListener value="#{cotacoes}"
                                                                         target="#{cotacoesBean.cotacoes}"/>
                                        </p:commandLink>	
                                         <p:spacer width="10"/>
                                        <p:commandLink id="lnkRemover"
                                    			   title="#{msg['button.remover']}"                                    			                                 
                                                   oncomplete="confirmarRemoverRegistro.show();
                                                               jQuery('#btnConfirmarRemoverRegistroNao').focus();"
                                                   update=":opPrincipal">
                                        <p:graphicImage value="/resources/imagens/remover.png"/>
                                        <f:setPropertyActionListener value="#{cotacoes}"
                                                                     target="#{cotacoesBean.cotacoes}"/>
                                    </p:commandLink>										
                                </p:column>
                                <p:column id="clmHorario"
                                          sortBy="#{cotacoes.horario}"
                                          filterBy="#{cotacoes.horario}"
                                          filterMatchMode="contains"
                                          filterStyle="width:20%"
                                          styleClass="dtCotacoesHorario">
                                    <f:facet name="header">
                                       <h:outputText value="#{msg['cotacoes.horario']}"/>
                                    </f:facet>
                                    <h:outputText value="#{cotacoes.horario}">  
						                <f:convertDateTime timeZone="GMT-3" pattern="dd/MM/yyyy HH:mm:ss" />  
						            </h:outputText>                       
                                </p:column>                                
                            </p:dataTable>
                            <h:panelGrid styleClass="panelGrid100"
                                         cellpadding="0"
                                         cellspacing="0"
                                         columns="2"
                                         columnClasses="panelGridColumnLeft50,panelGridColumnRight50">
                                <p:commandButton id="btnNovoInferior"
                                                 icon="ui-icon-document"
                                                 value="#{msg['button.novo']}"
                                                 title="#{msg['button.novo.title']}"                                             
                                                 oncomplete="jQuery('#inpHorario').focus();"
                                                 action="#{cotacoesBean.incluir}"
                                                 styleClass="button100"
                                                 update=":opPrincipal"/>
                                <p:commandButton id="btnRecarregarInferior"
                                                 icon="ui-icon-arrowrefresh-1-e"
                                                 value="#{msg['button.recarregar']}"
                                                 title="#{msg['button.recarregar.title']}"                                                 
                                                 oncomplete="jQuery('#dtUnidade\\:clmHorario_filter').focus();"
                                                 action="#{cotacoesBean.init}"
                                                 styleClass="button100"/>
                            </h:panelGrid>
                        </p:outputPanel>
                        <p:confirmDialog id="dlgConfirmarRemoverRegistro"
                                         header="#{msg['geral.confirmar.remover.registro.header']}" 
                                         message="#{msg['geral.confirmar.remover.registro']} #{cotacoesBean.cotacoes.horarioFormatado} ?"
                                         severity="alert" 
                                         modal="true"
                                         widgetVar="confirmarRemoverRegistro">  
                            <p:commandButton id="btnConfirmarRemoverRegistroSim"                                             
                                             value="#{msg['geral.sim']}"
                                             update=":opPrincipal"
                                             oncomplete="jQuery('#dtUnidade\\:clmHorario').click();
                                             			 jQuery('#dtUnidade\\:clmHorario_filter').focus();
                                                         confirmarRemoverRegistro.hide();"
                                             actionListener="#{cotacoesBean.remover}"/>  
                            <p:commandButton id="btnConfirmarRemoverRegistroNao"                                             
                                             value="#{msg['geral.nao']}"                                             
                                             onclick="confirmarRemoverRegistro.hide();"
                                             oncomplete="jQuery('#dtUnidade\\:clmDescricao_filter').focus()"/>
                        </p:confirmDialog> 
                    </h:form>
                    </p:panel>
                    </p:outputPanel>
        </ui:define>
    </ui:composition>
</html>

Alguem pode me ajudar com a questão de salvar no banco de dados? A anterior do click funcionar já esta dando certo.