Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Dúvida no Ex. 6 da Aula 5 - Dados tabulares com Primefaces

Depois que adicionei FilterBy na minha tabela quando eu digito algo ele filtra direito, mas se depois eu usar a paginação os campos da tabela ficam Vazios, Preço vira R$0,00 e Data a data atual.

Tem como consertar isso?

É possível utilizar esses recursos com paginação Lazy onde só se busca uma parte dos dados ao invés de todos os dados? Se sim, como?

O código da minha tabela:

Livros

ISBN

Preço

Data

Alterar

Remover

Obrigado!

4 respostas

O código do .xhtml não apareceu, botei de novo pra ver se agora dá pra visualizar

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

Livros

ISBN

Preço

Data

Alterar

Remover """""""""""""""""""""""""""""""""""""""""""

solução!

Acho que agora consegui por o código.

livro.xhtml

<p:dataTable id="tabelaLivros" value="#{livroBean.livros}" var="livro" paginator="true" rows="5">

            <f:facet name="header">Livros</f:facet>
            <p:column headerText="Título" sortBy="#{livro.titulo}" filterBy="#{livro.titulo}" filterMatchMode="startsWith">
                <h:outputText value="#{livro.titulo}"/>
            </p:column>

            <p:column sortBy="#{livro.isbn}" filterBy="#{livro.isbn}" filterMatchMode="contains">
                <f:facet name="header">ISBN</f:facet>
                <h:outputText value="#{livro.isbn}"/>
            </p:column>

            <p:column sortBy="#{livro.preco}" filterBy="#{livro.preco}" filterFunction="#{livroBean.precoEhMenor}">
                <f:facet name="header">Preço</f:facet>
                <h:outputText value="#{livro.preco}">
                    <f:convertNumber type="currency" pattern="R$ #0.00" currencySymbol="R$"
                        locale="pt_BR"/>
                </h:outputText>
            </p:column>

            <p:column sortBy="#{livro.dataLancamento.time}" filterBy="#{livro.dataLancamento.time}" 
                filterMatchMode="contains">
                <f:facet name="header">Data</f:facet>
                <h:outputText value="#{livro.dataLancamento.time}">
                    <f:convertDateTime pattern="dd/MM/yyyy" timeZone="America/Sao_Paulo"/>
                </h:outputText>
            </p:column>

            <p:column>
                <f:facet name="header">Alterar</f:facet>
                <h:commandLink value="Alterar" >
                    <f:setPropertyActionListener target="#{livroBean.livro}"
                        value="#{livro}"/>
                </h:commandLink>
            </p:column>

            <p:column>
                <f:facet name="header">Remover</f:facet>
                <h:commandLink value="Remover" action="#{livroBean.remover(livro)}"/>
            </p:column>
        </p:dataTable>

Classe LivroBean:


package br.com.caelum.livraria.bean;

import java.util.List;
import java.util.Locale;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;
import javax.validation.ValidationException;

import br.com.caelum.livraria.dao.DAO;
import br.com.caelum.livraria.modelo.Autor;
import br.com.caelum.livraria.modelo.Livro;

@ViewScoped
@ManagedBean
public class LivroBean {

    private Livro livro = new Livro();

    private Integer livroId;

    private Integer autorId;

    private List<Livro> livros;

    public Livro getLivro() {
        return livro;
    }

    public void setLivro(Livro livro) {
        this.livro = livro;
    }

    public void gravar() {
        System.out.println("Gravando livro " + this.livro.getTitulo());

        if (livro.getAutores().isEmpty()) {
            FacesContext.getCurrentInstance().addMessage("autor", 
                    new FacesMessage("Livro deve ter pelo menos um Autor"));
            return;
        }

        DAO<Livro> dao = new DAO<Livro>(Livro.class);

        if(this.livro.getId() == null) {
            dao.adiciona(this.livro);

            this.livros = dao.listaTodos();
        } else {
            dao.atualiza(this.livro);
        }

        this.livro = new Livro();
    }

    public void carregarLivroPeloId() {
        Integer id = this.livro.getId();
        this.livro = new DAO<Livro>(Livro.class).buscaPorId(id);
    }

    public Integer getAutorId() {
        return autorId;
    }

    public void setAutorId(Integer autorId) {
        this.autorId = autorId;
    }

    public List<Autor> getAutores() {
        return new DAO<Autor>(Autor.class).listaTodos();
    }

    public void gravarAutor() {
        Autor autor = new DAO<Autor>(Autor.class).buscaPorId(autorId);
        this.livro.adicionaAutor(autor);
    }

    public void carregar(Livro livro) {
        System.out.println("Carregando livro " + livro.getTitulo());
        this.livro = livro;
    }

    public void remover(Livro livro) {
        System.out.println("Removendo livro " + livro.getTitulo());
        new DAO<Livro>(Livro.class).remove(livro);
    }

    public void removerAutorDoLivro(Autor autor) {
        this.livro.removeAutorDoLivro(autor);
    }

    public List<Autor> getAutoresDoLivro() {
        return this.livro.getAutores();
    }

    public List<Livro> getLivros() {
        DAO<Livro> dao = new DAO<Livro>(Livro.class);

        if(this.livros == null) {
            this.livros = dao.listaTodos();
        }

        return this.livros;
    }

    public void comecaComDigitoUm(FacesContext fc, UIComponent component, Object value)
            throws ValidationException {
        String texto = value.toString();
        if(!texto.startsWith("1")) {
                throw new ValidatorException(
                        new FacesMessage("ISBN deve começar com digito um."));
        }
    }


    public boolean precoEhMenor(Object valorColuna, Object filtroDigitado, Locale locale) {
        //tirando espaços do filtro
        String textoDigitado = (filtroDigitado == null) ? null : filtroDigitado.toString().trim();

        System.out.println("Filtrando pelo: " + textoDigitado + ", valor do elemento: " + valorColuna);

        //o filtro é nulo ou vazio?
        if(textoDigitado == null || textoDigitado.equals("")) {
            return true;
        }

        //elemento da tabela é nulo?
        if (valorColuna == null) {
            return false;
        }

        try {
            //fazendo o parsing do filtro para converter para Double
            Double precoDigitado = Double.valueOf(textoDigitado);
            Double precoColuna = (Double) valorColuna;

            //comparando os valores, compareTo devolve um valor negativo se o value é menor do que o filtro
            return precoColuna.compareTo(precoDigitado) < 0;

        } catch (NumberFormatException e) {

            //usuario nao digitou um numero
            return false;

        }

    }

    public Integer getLivroId() {
        return livroId;
    }

    public void setLivroId(Integer livroId) {
        this.livroId = livroId;
    }

}

Olá,

Não.

A solução coloquei no meu repositório no GitLab, anteriormente divulgado.

Olá,

Um exemplo aqui: https://gitlab.com/cviniciusm/primedatatablelazy