[PrimeFaces] Paginação do p:dataTable [Resolvido]

24 respostas
A

Oies!
Estou mais uma vez com problemas com a tabela do PrimeFaces… :?
Dessa vez é o seguinte: eu tenho uma p:dataTable com paginação que tem 5 linhas por página, até aí tudo bem…
Fazendo uns testes eu inseri 6 registros nessa tabela, restando assim 1 linha para a página 2, aí por um acaso eu resolvi remover esse único elemento da página 2.
E quando eu removo esse elemento, a tabela não renderiza direito, segundo a paginação ele estaria na página 1, mas não trás os elementos da página 1, na realidade não trás nada.
Eu acredito que deve se tratar de um bug, por acaso alguém já testou isso? Eu estaria fazendo alguma coisa de errado no código?
Sendo assim segue o código para análise:
Form da tabela, por causa do commandButton:

<h:form id="formTabelaAutorizados">
    <p:dataTable var="autorizado" value="#{clienteBean.cliente.autorizados}" selectionMode="single" rows="5" paginator="true"
                 emptyMessage="Autorizados não encontrados" style="width: 100%" loadingMessage="Buscando..." id="tabelaAutorizados" >
        <p:column>
            <f:facet name="header"><h:outputText value="Nome"/></f:facet>
            <h:outputText value="#{autorizado.nome}" />
        </p:column>
        <p:column>
            <f:facet name="header"><h:outputText value="Telefone"/></f:facet>
            <h:outputText value="#{autorizado.telefone}" />
        </p:column>
        <p:column>
            <f:facet name="header"><h:outputText value="Observação"/></f:facet>
            <h:outputText value="#{autorizado.observacao}" />
        </p:column>
        <p:column>
            <p:commandButton actionListener="#{clienteBean.selecionarAutorizado}" update="formDadosAutorizado,formDesabilitarAutorizado" image="selecionar" title="Selecionar" >
                <f:attribute name="codigo" value="#{autorizado.codigo}" />
            </p:commandButton>
        </p:column>
    </p:dataTable>
</h:form>

Form que é atualizado ao clicar no commandButton da tabela:

<h:form id="formDadosAutorizado">
    <p:panel>
        <h:panelGrid columns="6" columnClasses="coluna40,coluna20,coluna40" cellpadding="3" width="100%">
            <h:outputText value="Nome" />
            <h:outputText value="Telefone" />
            <h:outputText value="Observação" />
            <h:outputText />
            <h:outputText />
            <h:outputText />
            <h:inputText id="nomeAutorizado" value="#{clienteBean.autorizado.nome}" style="width: 100%" required="true" requiredMessage="Informe o nome" />
            <p:inputMask id="telefoneAutorizado" mask="(999) 9999-9999" value="#{clienteBean.autorizado.telefone}" style="width: 100%" />
            <h:inputText id="observacaoAutorizado" value="#{clienteBean.autorizado.observacao}" style="width: 100%" />
            <p:commandButton image="salvar"  title="Salvar" actionListener="#{clienteBean.gravarAutorizado}" update="growl,formDadosAutorizado,formTabelaAutorizados"/>
            <p:commandButton image="desabilitar" title="Desabilitar" onclick="dlgDesabilitarAutorizado.show();" rendered="#{clienteBean.autorizado.codigo > 0}" immediate="true" />
        </h:panelGrid>
    </p:panel>
</h:form>

e enfim o confirmDialog que faz a remoção do registro e atualiza os dados da tabela:

<p:confirmDialog  widgetVar="dlgDesabilitarAutorizado" header="Desabilitar Autorizado" position="center" message="Deseja desabilitar o autorizado?" severity="alert" >
<h:form id="formDesabilitarAutorizado">
    <p:commandButton value="Sim" actionListener="#{clienteBean.desabilitarAutorizado }" update="tabelaAutorizados,growl,formDadosAutorizado,formTabelaAutorizados" oncomplete="dlgDesabilitarAutorizado.hide()" immediate="true"  image="ok"/>
    <p:commandButton value="Não" onclick="dlgDesabilitarAutorizado.hide()" immediate="true" image="cancelar" />
</h:form>
</p:confirmDialog>


24 Respostas

G

Olá andii.brunetta ,

comigo aconteceu mesma coisa, esses dias é um bug da ferramenta acontece o seguinte ele quardou a informação da pagina que vc estava (no seu caso na 2) e quando vc removeu o item ele não calculou novamente que agora so é possivel uma pagina ele simplemente se mantem na pagina 2 e como não tem nada acima de 5 não aparece nada.

Vamos ter q esperar futuras versão para corrigir isso :frowning:

A

:? Vixii… o jeito é esperar… mas caso eles não estiverem sabendo, fiz a postagem no forum do primeFaces :smiley:
http://primefaces.prime.com.tr/forum/viewtopic.php?f=3&t=6172

G

Ehehe legal :smiley:

A

Olá andii

Você já resolveu seu problema?

Tenta trocar seu <p:commandButton> por <h:commandButton>

Eu tenho uma tabela aqui que é semelhante a sua e ele atualiza a tabela depois de uma exclusão, a diferença é que eu não consegui implementar o confimDialog. Vou tentar o seu.

Abraço

A

Então asandro1501, o problema acaba nem sendo o commandButton, realmente isso se trata de um bug da versão 2.2 RC1 do PrimeFaces,
nessa postagem os “caras” do PrimeFaces tentam dar soluções, mas que ainda não estão implementadas na versão 2.1, algo tipo fazer um binding e dar um resetPagination() na dataTable
sei que já foi lançada a versão 2.2 RC2, assim que testar ela, posto se isso foi resolvido ou não!
Qual está sendo o seu problema com o confirmDialog? e qual a versão do PrimeFaces?

Editado: acabei de testar a versão 2.2 RC2, agora tem o método resetPagination(), mas é complicado colocar isso em todas as tabelas!
Como o sistema aqui vai demorar para ficar pronto, vou aguardar mais um pouco para ver se surge uma atualização dessa dataTable sem que seja “manualmente” :slight_smile:

A

Olá

Bem, pena que não pude ajudar.

Minha experiência com java web tem cerca de 2 meses. Mesmo copiando o código do site do Primefaces não executa da mesma forma. Queria usar o confirmdialog para excluir um registro mas ele abre, dura uns 3 segundos e desaparece executando a função determinada para o botão “Sim”. Mesmo selecionando o botão “Não” que deveria anular a operação, ele executa a exclusão. Mas acabei deixando de lado, e agora eu redireciono para um outra tela onde ele apresenta os dados do registro selecionado e então o usuário pode excluir ou cancelar a operação, de certa forma é até mais seguro.

Abraço

A

asandro1501, eu acho que sei o que está acontecendo por ele estar durando apenas esses 3 segundos… vc deve estar chamando ele por um h:commandButton, já passei por isso…
o h:commandButton atualiza a página quando é submetido, isso faz o confirmDialog fechar!, caso seja realmente isso, e caso não queira usar o p:commandButton, coloque um f:ajax dentro do h:commandButton
caso não saiba como fazer isso, retorne que eu ajudo.

A

Vc tem algum exemplo? Já tentei usar <p:commandbutton> mas não tive sucesso

Abraço

A

Segue o exemplo com o p:commandButton e o h:commandButton, os dois abriram normalmente o p:confirDialog

&lt;h:form&gt;
                &lt;!--  PrimeFaces 2.2  --&gt;
                &lt;p:commandButton  value="Desabilitar" onclick="dlgDesabilitarCliente.show();" immediate="true" update="formDesabilitarCliente" /&gt;
                &lt;!--  JSF 2.0 --&gt;
                &lt;h:commandButton  value="Desabilitar" onclick="dlgDesabilitarCliente.show();" immediate="true"&gt;
                    &lt;f:ajax event="click" render=":formDesabilitarCliente" /&gt;
                &lt;/h:commandButton&gt;
            &lt;/h:form&gt;

            &lt;p:confirmDialog  widgetVar="dlgDesabilitarCliente" header="Desabilitar Cliente" position="center" message="Deseja desabilitar o cliente?" severity="alert" &gt;
                &lt;h:form id="formDesabilitarCliente"&gt;
                    &lt;p:commandButton value="Sim" actionListener="#{clienteBean.desabilitar}" update="formTabelaClientes" oncomplete="dlgDesabilitarCliente.hide()" immediate="true"  image="ok"/&gt;
                    &lt;p:commandButton value="Não" onclick="dlgDesabilitarCliente.hide()" immediate="true" image="cancelar" /&gt;
                &lt;/h:form&gt;
            &lt;/p:confirmDialog&gt;
R

andii.brunetta, posso lhe pedir uma ajuda,

estou com problemas com o confirmDialog, pois sempre que chamo o confirmDialog o objeto que seto no parametro vem vazio, você já passou por isso?

A

Olá rjunior!
teria como vc postar o código para mim dar uma olhada?
assim fica mais fácil dizer o que está acontecendo, mas acredito que esteja faltando atualizar o form do confirmDialog ao chamá-lo.

Aguardo retorno.

R

Segue o código,
o problema é que quando eu clico no botão para abrir o confirmDialog, o objeto retorna null,
já tentei todas as formas que conheco para atribuir o valor ao objeto, mas não consegui.

Fiz um debbug e o que percebi é que quando o confirmDialog abre ele gera uma nova instancia no meu bean.

Conto com sua ajuda, pois já estou a dias quebrando a cabeça com isso e não achei nada na net.

E desde já agradeço.

<!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:ui="http://java.sun.com/jsf/facelets"
	xmlns:p="http://primefaces.prime.com.tr/ui">

<ui:composition template="/template/templateAdm.xhtml">
	<ui:define name="conteudo">
    <h:form id="formTb">
      <p:dataTable id="tbCategoria" 
                   rows="20"
                   paginator="true"
                   var="c"
                   value="#{categoriaBean.categorias}">
                   
         <p:column headerText="Código">
          <h:outputText value="#{c.codigo}" />
         </p:column>
         
         <p:column headerText="Descricao">
          <h:outputText value="#{c.descricao}" />
         </p:column>          
         
         <p:column headerText="Opções">
            <p:commandButton oncomplete="panelExcluir.show();" value="Excluir">
              <f:setPropertyActionListener target="#{categoriaBean.catSelecionada}" value="#{c}"></f:setPropertyActionListener>
            </p:commandButton> 
         </p:column>
      
      </p:dataTable>
    </h:form>
    
    <p:confirmDialog message="Excluir: #{categoriaBean.catSelecionada.descricao}" widgetVar="panelExcluir" modal="true">
      <h:form id="formExcluir">
        <p:commandButton value="Sim" oncomplete="panelExcluir.hide();" update="formTb,formExcluir" action="#{categoriaBean.excluir}"/>
      </h:form>
    </p:confirmDialog>
    
  </ui:define>
</ui:composition>
</html>
R

E aqui o Bean

@ManagedBean(name = "categoriaBean")
@RequestScoped
public class CategoriaBean {

	@ManagedProperty(value = "#{entity}")
	private EntityManager entityManager;

	private Categoria categoria = new Categoria();
	private List<Categoria> categorias;
	private Categoria catSelecionada;
	
	public String salvar(){
		Dao<Categoria> dao = new Dao<Categoria>(Categoria.class, this.entityManager);

		if(categoria.getCodigo() == null || categoria.getCodigo() == 0) {
			categoria.setCodigo(null); 
			dao.salvar(this.categoria);
			categoria = new Categoria();
			return "";
		} else {
			System.out.println("Atualizar "+ categoria.getCodigo());
			dao.atualiza(this.categoria);
			return "listCategoria";
		}
	}
	
	
	public List<Categoria> getCategorias() {
		if(categorias == null ){
			//CategoriaRepository rep = new CategoriaRepository(entityManager);
			Dao<Categoria> dao = new Dao<Categoria>(Categoria.class, this.entityManager);
			categorias = dao.listarTodos();
			
		}
		return categorias;
	}

	public void excluir(){
		System.out.println(this.catSelecionada.getCodigo());
	}
	
	//Getters e Setters
A

Olha, eu vou chutar meio alto, que pode ser que falta o update no form que está dentro do confirmDialog

&lt;p:commandButton oncomplete="panelExcluir.show();" value="Excluir" update="formExcluir"&gt;  
         &lt;f:setPropertyActionListener target="#{categoriaBean.catSelecionada}" value="#{c}"&gt;&lt;/f:setPropertyActionListener&gt;  
      &lt;/p:commandButton&gt;

e como vc quer que apareça a descrição da categoria: coloque o form por fora do confirmDialog:

&lt;h:form id="formExcluir"&gt;  
      &lt;p:confirmDialog message="Excluir: #{categoriaBean.catSelecionada.descricao}" widgetVar="panelExcluir" modal="true"&gt;  
         &lt;p:commandButton value="Sim" oncomplete="panelExcluir.hide();" update="formTb,formExcluir" action="#{categoriaBean.excluir}"/&gt;  
      &lt;/p:confirmDialog&gt; 
   &lt;/h:form&gt;

Não testei isso… não sei se vai funcionar colocar o form por fora do confirmDialog rsrs (acredito que funcione)
Outro detalhe que poderia ser é o escopo do bean, vejo que está como @RequestScoped, tente colocar o @SessionScoped só para testar. No dia a dia eu uso o conversation (que está entre o request e o session) !
[size=9]Ps: não fiz testes porque estou no trabalho, mas veja esses detalhes qualquer coisa testo em casa![/size]

R

Muito obrigado andii.bruneta,
você foi certeira, eu estava atualizando o confirmDialog e não o form.

Valeu mesmo.

A

Que bom que deu certo! :smiley:

E

Olá andii.bruneta,

Você conseguiu resolver o probelma da paginação ao excluir os itens? eu vi no forum oficial do Primefaces o método resetPagination="true" mas não funcionou :frowning:

Preciso desta solução urgente, se você tiver um Workround por favor me fale.

Obrigado.

A

então ederfreitas…
acabei largando isso de lado, o projeto é meio extenso, e vai demorar ficar pronto,
então decidimos ficar na esperança do PrimeFaces corrigir isso em alguma futura versão!
Mas é bem phoda isso! :?

E

Então, estou com um projeto aqui na empresa que é “pra ontem” e não dá pra ficar perdendo tempo né. Este mês sai a versão final do primefaces RC 2. Esperamos que este bug tenha sido corrigdo né.

Acho que como soluão de contorno vou usar a tabela no modo liveScroll.

Obrigado pelo retorno.

Abraços

T

andii.brunetta / ederfreitas

Sou novo no mundo java e no PrimeFaces, entretanto pesquisando no fórum oficial e no code.google.com, encontrei a solução para o problema.
O atributo resetPagination=“true” informado pelo ederfreitas não existe nas versões anteriores, somente na versão 2.2RC, mas ainda sim aparenta estar com problemas.

Entretanto o nosso querido optimus.prime deu como solução atualizar a tabela via javascript, com os métodos resetPagination, setPage ou setFirst.
Segue mensagem dele:

O link para esta resposta é a seguinte: http://primefaces.prime.com.tr/forum/viewtopic.php?f=3&t=5993&p=25405&hilit=resetPagination#p25405
E o link do Google Code é este: http://code.google.com/p/primefaces/issues/detail?id=1485

Espero que isso possa ajudá-los.


Já eu estou com problema na paginação, de um modo que ela nem sequer aparece.
Os atributos paginator e paginatorAlwaysVisible estão como true. Mas não aparece de jeito nenhum.
Alguma dica? =P

E

tdt, não entendi muito bem essa solução, aonde devo chamar estes métodos?

Com relação ao seu problema, nunca passei por isso, qual a versão do Primefaces?

Tente usar da seguinte forma:

<p:dataTable var="propriedade" loadingMessage="Carregando..." value="#{mBConector.listProperties}" paginator="true" paginatorPosition="top" rows="10" emptyMessage="Nenhum registro encontrado." style="width: 100%" id="table">

P.S. Obrigado pela resposta :slight_smile:

T

ederfreitas,

eu me equivoquei!
Estes métodos não devem ser chamados via javascript.
Devem ser colocados em um método chamado pelo atributo binding, método este implementado em um backing bean mais ou menos como este: http://primefaces.prime.com.tr/forum/viewtopic.php?f=3&t=6172&sid=2292a35b51cd065cdd1d5fef57cc989d&start=10#p25987

Quanto ao meu problema. Eu resolvi, faltava somente postar aqui.
Acontece que estou fazendo a minha aplicação toda via ajax (até a mudança de menu/página).
Criei uma função javascript para requisitar os .xhtml, e ao receber a resposta estava incluindo somente o no

destino onde seria exibido o conteúdo.
Faltava incluir o conteúdo da tag da resposta na minha tag do index, pois nessa tag que são informados a maioria dos scripts e estilos css que são usados no componente e fazem toda a mágica.

Quando percebi isso efetuei a alteração na minha função em javascript e tudo funcionou perfeitamente. =)
Mas de qualquer forma, obrigado pela atenção.
E a propóstio estou usando JSF 2.0 com Facelets + JPA 2.0 + PrimeFaces 2.2RC.

E

Senhores e senhoritas, o primefaces 2.2 final foi liberado:

Baixe a ultima versão e testei, meu problema foi liberado, meu projeto já havia sido conlcuído mas agora vou considerar como correção de bugs ^^

Link para download:

http://repository.prime.com.tr/org/primefaces/primefaces/2.2/primefaces-2.2.jar

Só acho uma pena que a documentação tornou-se paga, aquela de 400 e poucas páginas (Se não estou equivocado).

Abraços, e obrigado pela colaboração de quem respondeu ao tópico.

A

Olá ederFreitas, eu não cheguei a usar a versão final. Onde eu trabalho, eles baixaram a versão: 2.2-SNAPSHOT e recompilaram e vi que nela já funcionava certinho! Vou colocar o tópico como resolvido! :wink:

Criado 22 de novembro de 2010
Ultima resposta 16 de fev. de 2011
Respostas 24
Participantes 6