[RESOLVIDO] Problema com o Datatable do primefaces

9 respostas
F

olá pessoal, estou com um problema e não consigo resolver.

tenho um datatable que funciona certo mas quando eu removo a linha selecionada, remove a linha da lista de maneira correta porém quando faço o update do componente a tabela volta com todas as linhas selecionadas, quero que a tabela volte sem nenhuma linha selecionada, como resolvo isso?

figura 1: após inseridos os itens na tabela o funcionamento é normal

figura 2: depois de clicar em remover - remove a linha mas fica tudo selecionado ( neste exemplo a linha 7 foi escolhida e removida com exito).

aguardo ansiosamente a resposta de vocês.

9 Respostas

esdras_63

Olá, você provavelmente possui algum campo no seu bean que representa a linha selecionada, como aqueles selectedItem dos exemplos do primefaces, certo? Se possui, tente no método de remoção, setar nulo nele ou instanciá-lo novamente, assim você diz que não possui nenhuma linha selecionada na tabela.

F

sim eu tenho no bean um objeto que representa a linha, e ao chamar o método no botão remover ele esta sendo instanciado novamente.

benignoms

Posta o código. Tanto o MB quanto o xhtml

F
codigo da view:
<?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">
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:p="http://primefaces.prime.com.tr/ui"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:f="http://java.sun.com/jsf/core">

    <p:dialog id="dialogReq" header="Senha para nova requisicao" widgetVar="dlgReq" position="center" resizable="false" width="500" modal="true">
        <h:form prependId="false">
            <p:outputPanel id="requisicao" >
                <center>
                    <h:panelGrid columns="3" columnClasses="coluna_label">
                        <h:outputText value="Digite a senha: *" />  
                        <p:password value="#{cadastroRequisicaoController.funcionarioSenha}" required="true" minLength="5" maxlength="20" feedback="false" />
                        <p:commandButton image="ui-icon-search" action="#{cadastroRequisicaoController.verificaSenha()}" update="mensagem panelRequisicao requisicao" oncomplete="dlgRequisicao.show()" />
                    </h:panelGrid>
                </center>
            </p:outputPanel>
        </h:form>
    </p:dialog>

    <p:dialog id="dlgRequisicao" header="Nova Requisicao" widgetVar="dlgRequisicao" position="center" resizable="false" width="500" modal="true">
        <h:form prependId="false">
            <p:outputPanel id="panelRequisicao">
                <h:panelGrid columns="4" columnClasses="coluna_label,,coluna_label">
                    <h:outputText value="Funcionario: " />  
                    <p:inputText value="#{cadastroRequisicaoController.funcionario.pessoa.nome}" size="37" required="true" disabled="true" />
                    <h:outputText value="Data: " />
                    <h:outputText value="#{cadastroRequisicaoController.dataAtual}">
                        <f:convertDateTime pattern="dd/MM/yyyy"/>
                    </h:outputText>
                </h:panelGrid>
                <h:panelGrid columns="2" columnClasses="coluna_label">
                    <h:outputText value="Selecione o setor: *" />  
                    <h:selectOneMenu value="#{cadastroRequisicaoController.setorFuncionarioItem}" required="true" style="width: 210px; text-transform: uppercase">  
                        <f:selectItem itemLabel="Setor" itemValue="" />  
                        <f:selectItems value="#{cadastroRequisicaoController.setorFuncionarioListaItens}" />
                    </h:selectOneMenu>
                </h:panelGrid>
                <h:panelGrid columns="2" columnClasses="coluna_label">
                    <h:outputText value="Status: " />  
                    <p:inputText value="#{cadastroRequisicaoController.novaRequisicao.status.descricao}" size="25" disabled="true" />
                </h:panelGrid><br />
                <center>
                    <p:dataTable id="tabelaRequisicao" var="umItem"  value="#{cadastroRequisicaoController.requisicaoItemList}" selectionMode="single"
                                 selection="#{cadastroRequisicaoController.requisicaoItemSelecionado}" style="width: 420px">
                        <f:facet name="header">Lista de itens</f:facet>
                        <p:column headerText="Item">#{umItem.item.descricao}</p:column>
                        <p:column headerText="Qtd." style="width: 10px">
                            <p:cellEditor>
                                <f:facet name="output">
                                    <h:outputText value="#{umItem.quantidade}" style="width: 10px" />
                                </f:facet>
                                <f:facet name="input">
                                    <h:inputText value="#{umItem.quantidade}" size="6" />
                                </f:facet>
                            </p:cellEditor>	
                        </p:column>
                        <p:column style="width: 35px">
                            <p:rowEditor />
                        </p:column>
                        <f:facet name="footer">
                            <p:commandButton value="Adicionar" update="panelAddItem" oncomplete="itemAddDialog.show()" />&nbsp;&nbsp;
                            <p:commandButton value="Remover" action="#{cadastroRequisicaoController.removeRequisicaoListaItens()}" update="tabelaDeItens tabelaRequisicao" />
                        </f:facet>
                    </p:dataTable><br />
                    <p:separator /><br />
                    <p:commandButton value="Enviar" update="mensagem requisicao panelRequisicao" action="#{cadastroRequisicaoController.criaRequisicao()}" oncomplete="dlgRequisicao.hide()" />
                </center>
            </p:outputPanel>
        </h:form>
    </p:dialog>

    <p:dialog header="Item" widgetVar="itemAddDialog" resizable="false" width="500" modal="true">
        <p:outputPanel id="panelAddItem" style="text-align: left">
            <h:form prependId="false">
                <p:dataTable id="tabelaDeItens" var="ite" value="#{cadastroRequisicaoController.listaDeItens}" selectionMode="single" 
                             selection="#{cadastroRequisicaoController.itemSelecionado}" onRowSelectUpdate="panelAddItem"
                             onRowUnselectUpdate="outpAddItem" rowUnselectListener="#{cadastroRequisicaoController.resetaItem()}" 
                             paginator="true" rows="20">
                    <p:column filterBy="#{ite.descricao}">
                        <f:facet name="header">
                            <h:outputText value="Item" />
                        </f:facet>
                        <h:outputText value="#{ite.descricao}" />
                    </p:column>
                </p:dataTable><br />
                <h:panelGrid columns="4" columnClasses="coluna_label,,coluna_label">
                    <h:outputText value="Descrição: *" />  
                    <p:inputText value="#{cadastroRequisicaoController.itemSelecionado.descricao}" required="true" disabled="true" size="34" />
                    <h:outputText value="Qtd.: *" />  
                    <p:inputText value="#{cadastroRequisicaoController.requisicaoItem.quantidade}" required="true" size="6" />
                </h:panelGrid><br />
                <center>
                    <p:commandButton value="Adicionar" action="#{cadastroRequisicaoController.adicionaListaItens()}" process="@this panelAddItem"
                                     update="mensagem tabelaRequisicao panelAddItem" oncomplete="itemAddDialog.hide()" />
                </center>
            </h:form>
        </p:outputPanel>
    </p:dialog>
</ui:composition>
codigo do bean:
package controller;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import modelo.*;
import servico.*;
import utilitario.Mensagens;

/**
 *
 * @author fainorti
 */
public class CadastroRequisicaoManagedBean {

    @EJB
    private RequisicaoItemFacadeLocal requisicaoItemFacade;
    @EJB
    private TipoParticipacaoFacadeLocal tipoParticipacaoFacade;
    @EJB
    private RequisicaoFacadeLocal requisicaoFacade;
    @EJB
    private ItemFacadeLocal itemFacade;
    @EJB
    private SetorFacadeLocal setorFacade;
    @EJB
    private StatusFacadeLocal statusFacade;
    @EJB
    private ParticipacaoFacadeLocal participacaoFacade;
    @EJB
    private FuncionarioFacadeLocal funcionarioFacade;
    /**
     * VARIAVEIS
     */
    private Date dataAtual;
    private Participacao participacao;
    private Requisicao novaRequisicao;
    private Funcionario funcionario;
    private String funcionarioSenha;
    private boolean renderiza;
    private Status status;
    private List<Setor> funcionarioSetorLista;
    private List<SelectItem> setorFuncionarioListaItens;
    private Integer setorFuncionarioItem;
    private Setor setor;
    private List<Item> listaDeItens;
    private Item itemSelecionado,
            itemEscolhido;
    private RequisicaoItem requisicaoItem,
            requisicaoItemSelecionado;
    private List<RequisicaoItem> requisicaoItemList;

    /**
     * Creates a new instance of CadastroRequisicaoManagedBean
     */
    public CadastroRequisicaoManagedBean() {
    }

    @PostConstruct
    public void novo() {
        dataAtual = new Date();
        participacao = new Participacao();
        novaRequisicao = new Requisicao();
        novaRequisicao.setParticipacaoList(new ArrayList<Participacao>());
        novaRequisicao.setStatus(statusFacade.find(1));
        funcionario = new Funcionario();
        funcionario.setFuncionarioCargoList(new ArrayList<FuncionarioCargo>());
        funcionarioSenha = new String();
        renderiza = false;
        setor = new Setor();
        funcionarioSetorLista = new ArrayList<Setor>();
        itemSelecionado = new Item();
        requisicaoItem = new RequisicaoItem();
        requisicaoItemList = new ArrayList<RequisicaoItem>();
        listaDeItens = new ArrayList<Item>();
    }

    public void verificaSenha() {
        requisicaoItemList = new ArrayList<RequisicaoItem>();
        setorFuncionarioItem = null;
        try {
            funcionario = funcionarioFacade.buscaPorSenha(funcionarioSenha);
            renderiza = true;
        } catch (Exception e) {
            renderiza = false;
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                    "Usuário não encontrado!" + e.toString(), null));
        }
        funcionarioSenha = null;
    }

    public void resetaItem() {
        itemSelecionado = new Item();
    }

    public void removeRequisicaoListaItens() {
        RequisicaoItem r;
        for (int i = 0; i < requisicaoItemList.size(); i++) {
            r = requisicaoItemList.get(i);
            if (r.getItem().getCodigo().equals(requisicaoItemSelecionado.getItem().getCodigo())) {
                requisicaoItemList.remove(i);
                listaDeItens.add(requisicaoItemSelecionado.getItem());
            }
        }
        requisicaoItemSelecionado = new RequisicaoItem();
    }

    public void criaRequisicao() {
        try {
            participacao.setDataParticipacao(dataAtual);
            participacao.setFuncionario(funcionario);
            participacao.setTipoParticipacao(tipoParticipacaoFacade.find(1));
            participacaoFacade.create(participacao);
            novaRequisicao.setSetor(setor);
            novaRequisicao.setDataRequisicao(dataAtual);
            requisicaoFacade.create(novaRequisicao);
            participacao.setRequisicao(novaRequisicao);
            novaRequisicao.getParticipacaoList().add(participacao);
            participacaoFacade.edit(participacao);
            for (int i = 0; i < requisicaoItemList.size(); i++) {
                RequisicaoItem r = requisicaoItemList.get(i);
                r.setRequisicao(novaRequisicao);
//                requisicaoItemFacade.create(r);
                novaRequisicao.getRequisicaoItemList().add(r);
            }
            requisicaoFacade.edit(novaRequisicao);
            novo();
            Mensagens.sucessoGravacao();
        } catch (Exception e) {
        }
    }

    public void adicionaListaItens() {
        if (itemSelecionado.getCodigo() != null) {
            requisicaoItem.setItem(itemSelecionado);
            requisicaoItemList.add(requisicaoItem);
            listaDeItens.remove(itemSelecionado);
            requisicaoItem = new RequisicaoItem();
        } else {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                    "Nenhum item foi selecionado!", null));
        }
    }

    /**
     * Get e SET
     */
    public Date getDataAtual() {
        return dataAtual;
    }

    public void setDataAtual(Date dataAtual) {
        this.dataAtual = dataAtual;
    }

    public Funcionario getFuncionario() {
        return funcionario;
    }

    public void setFuncionario(Funcionario funcionario) {
        this.funcionario = funcionario;
    }

    public String getFuncionarioSenha() {
        return funcionarioSenha;
    }

    public void setFuncionarioSenha(String funcionarioSenha) {
        this.funcionarioSenha = funcionarioSenha;
    }

    public boolean isRenderiza() {
        return renderiza;
    }

    public void setRenderiza(boolean renderiza) {
        this.renderiza = renderiza;
    }

    public Status getStatus() {
        return status;
    }

    public void setStatus(Status status) {
        this.status = status;
    }

    public Requisicao getNovaRequisicao() {
        return novaRequisicao;
    }

    public void setNovaRequisicao(Requisicao novaRequisicao) {
        this.novaRequisicao = novaRequisicao;
    }

    public Integer getSetorFuncionarioItem() {
        return setorFuncionarioItem;
    }

    public void setSetorFuncionarioItem(Integer setorFuncionarioItem) {
        this.setorFuncionarioItem = setorFuncionarioItem;
        setor = setorFacade.find(setorFuncionarioItem);
    }

    public List<SelectItem> getSetorFuncionarioListaItens() {
        setorFuncionarioListaItens = new ArrayList<SelectItem>();
        funcionarioSetorLista = new ArrayList<Setor>();
        for (FuncionarioCargo fc : funcionario.getFuncionarioCargoList()) {
            if (fc.getDataFinal() == null) {
                for (SetorFuncionarioCargo sfc : fc.getSetorFuncionarioCargoList()) {
                    if (sfc.getDataFinal() == null) {
                        if (funcionarioSetorLista.contains(sfc.getSetor())) {
                        } else {
                            funcionarioSetorLista.add(setorFacade.find(sfc.getSetor().getCodigo()));
                        }
                    }
                }
            }
        }
        for (Setor s : funcionarioSetorLista) {
            SelectItem i = new SelectItem(s.getCodigo(), s.getSigla());
            setorFuncionarioListaItens.add(i);
        }
        return setorFuncionarioListaItens;
    }

    public void setSetorFuncionarioListaItens(List<SelectItem> setorFuncionarioListaItens) {
        this.setorFuncionarioListaItens = setorFuncionarioListaItens;
    }

    public Item getItemSelecionado() {
        return itemSelecionado;
    }

    public void setItemSelecionado(Item itemSelecionado) {
        this.itemSelecionado = itemSelecionado;
    }

    public List<Item> getListaDeItens() {
        if (listaDeItens.isEmpty()) {
            listaDeItens = new ArrayList<Item>();
            for (Item k : itemFacade.findAll()) {
                listaDeItens.add(k);
            }
        }
        return listaDeItens;
    }

    public void setListaDeItens(List<Item> listaDeItens) {
        this.listaDeItens = listaDeItens;
    }

    public Item getItemEscolhido() {
        return itemEscolhido;
    }

    public void setItemEscolhido(Item itemEscolhido) {
        this.itemEscolhido = itemEscolhido;
    }

    public List<RequisicaoItem> getRequisicaoItemList() {
        return requisicaoItemList;
    }

    public void setRequisicaoItemList(List<RequisicaoItem> requisicaoItemList) {
        this.requisicaoItemList = requisicaoItemList;
    }

    public RequisicaoItem getRequisicaoItemSelecionado() {
        return requisicaoItemSelecionado;
    }

    public void setRequisicaoItemSelecionado(RequisicaoItem requisicaoItemSelecionado) {
        this.requisicaoItemSelecionado = requisicaoItemSelecionado;
    }

    public RequisicaoItem getRequisicaoItem() {
        return requisicaoItem;
    }

    public void setRequisicaoItem(RequisicaoItem requisicaoItem) {
        this.requisicaoItem = requisicaoItem;
    }
}
benignoms

Primefaces 2.2 ? Ok, você sobreescreeveu os métodos equals e hashcode da classe Item?

F

sim é a versão 2.2.1 do primefaces, eu não sobreescrevi os metodos equals e hashcode, pelo menos não estando ciente disso.

benignoms

Ok, na classe Item faz a sobreescritura dos métodos equals e hashcode, limpa e reconstroi a app e testa.

F

eu comentei esta parte na classe do objeto

//    @Override
//    public int hashCode() {
//        int hash = 0;
//        hash += (codigo != null ? codigo.hashCode() : 0);
//        return hash;
//    }
//
//    @Override
//    public boolean equals(Object object) {
//        // TODO: Warning - this method won't work in the case the id fields are not set
//        if (!(object instanceof RequisicaoItem)) {
//            return false;
//        }
//        RequisicaoItem other = (RequisicaoItem) object;
//        if ((this.codigo == null && other.codigo != null) || (this.codigo != null && !this.codigo.equals(other.codigo))) {
//            return false;
//        }
//        return true;
//    }

e ao que parece funcionou perfeitamente, mas o que voce quis dizer com sobreescrever?
agradeço sua ajuda benigno,
porque isso acontece? :slight_smile:

benignoms

Override = sobreescrever. Acho que é bug da versão… por que você não usa a versão 3.2? Houve um grande avanço da 2 para a 3.

Criado 8 de março de 2012
Ultima resposta 13 de mar. de 2012
Respostas 9
Participantes 3