7
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?

livro.xhtml

<h:form id="formTabelaLivros">
        <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>
    </h:form>

LivroBean.java

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;
    }

}
7 respostas

Oi Raphael,

no site do primefaces tem um exemplo que mostra como trabalhar com o LazyDataModel:

http://www.primefaces.org/showcase/ui/data/datatable/lazy.xhtml

Agora o outro problema não consegui reproduzir. Isso só acontece quando vc usa o filtro pelo preço?

abs

Oi Nico,

Obrigado pelo LazyDataModel.

Ele acontece quando eu uso qualquer um dos filtros da tabela e depois clico em outra paginação, e mesmo quando limpo o campo do filtro só a primeira página da paginação mostra os livros as outras paginações ficam Titulo e ISBN em branco, Preço fica R$0,00 e Data fica a data atual.

abs

Estou tendo problema em ultilizar filtro no dateTable com selectOneMenu. Segui o exemplo que é disponível no showCase do Primefaces mas não entendi direito o conceito. Meu select busca em branco para filtrar. Vocês poderiam me ajudar?

Oi Diego,

posso pedir um favor?

Abre um novo tópico para essa duvida. alem disso, já compartilha o seu código e xhtml.

Vou ficar de olhar e tento ajudar :)

Obrigado, Nico

Ok, muito obrigado Nico.

Olá,

Resolvi isso. Deixei disponivel no meu repositório no GitLab.

O problema é porque tem que definir o filteredValue na tabela. Tipo:

filteredValue="#{livroBean.livrosFilter}"

e inserir no livroBean outra lista com seu get e set. insira seu código aqui

private List<Livro> livrosFilter;