Ajuda - Selecionar um item específico de um data table(PrimeFaces)

10 respostas
J

Bom dia pessoal, seguinte estou conseguindo popular meu data table com todos os dados do banco
está vindo certinho.

Agora estou tentando fazer o seguinte, coloquei uma coluna a mais no meu data table onde ao clicar abriria um dialog com as informações detalhadas da linha selecionada.

Se alguem puder me dar uma luz, eu agradeço

segue o código da pagina:

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:p="http://primefaces.org/ui"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <title></title>
    </h:head>

    <!--Página responsável pelo cadastro dos personagens do jogador -->
    <ui:composition template="/template/template.xhtml">

        <ui:define name="conteudo">

            <div>
                <p:dataTable value="#{personagemMB.listarPersonagens()}" var="personagem" paginator="true" rows="3">
                    <f:facet name="header">
                        Lista de Personagens
                    </f:facet>

                    <p:column headerText="Nome">
                        <h:outputText value="#{personagem.nome}"/>
                    </p:column>
                    
                    <p:column headerText="Classe">
                        <h:outputText value="#{personagem.classe}"/>
                    </p:column>
                    
                    <p:column headerText="Raça">
                        <h:outputText value="#{personagem.raca}"/>
                    </p:column>
                    
                    <p:column headerText="Alterar">
                        <p:commandButton id="SelectButton" update="detalhesPainel" onclick="personagem.show();" icon="ui-icon-search" title="Alterar" type="button">
                            <f:setPropertyActionListener target="#{personagemMB.personagemSelecionado}" value="#{personagem}" />
                        </p:commandButton>
                    </p:column>
                
                </p:dataTable> 

                <p:dialog header="Detalhes / Alterar" widgetVar="personagem" resizable="false" id="personagemDialog" showEffect="fade"
                          hideEffect="explode" >

                    <p:panelGrid id="detalhesPainel" columns="2">
                        <h:outputText value="Nome" />
                        <h:outputText value="#{personagemMB.personagemSelecionado.nome}"/>
                    </p:panelGrid>

                </p:dialog>

            </div>

        </ui:define>

    </ui:composition>

</html>

Meu bean

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.jragonha.mbeans;

import br.com.jragonha.bd.PersonagemDAO;
import br.com.jragonha.models.Classe;
import br.com.jragonha.models.Personagem;
import br.com.jragonha.models.Raca;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

/**
 *
 * @author jilles ragonha
 */
@ManagedBean
@RequestScoped
public class PersonagemMB implements Serializable {

    private Personagem personagemSelecionado;
    private Personagem personagem = new Personagem();
    private List<Classe> classes = new ArrayList<Classe>();
    private List<Raca> racas = new ArrayList<Raca>();
    private PersonagemDAO dao = new PersonagemDAO();
    List<Personagem> personagens = new ArrayList<Personagem>();
    String outcome;

    public List<Raca> getRacas() {
        return racas;
    }

    public Personagem getPersonagemSelecionado() {
        return personagemSelecionado;
    }

    public void setPersonagemSelecionado(Personagem personagemSelecionado) {
        this.personagemSelecionado = personagemSelecionado;
    }

    public void setRacas(List<Raca> racas) {
        this.racas = racas;
    }

    public List<Classe> getClasses() {
        return classes;
    }

    public void setClasses(List<Classe> classes) {
        this.classes = classes;
    }

    public PersonagemDAO getDao() {
        return dao;
    }

    public void setDao(PersonagemDAO dao) {
        this.dao = dao;
    }

    public Personagem getPersonagem() {
        return personagem;
    }

    public void setPersonagem(Personagem personagem) {
        this.personagem = personagem;
    }

    /**
     * Método usado para salvar o personagem em um banco
     *
     * @return
     */
    public String salvarPersonagem() {
        if (dao.salvar(personagem)) {
            outcome = "SALVO";
        }
        return outcome;
    }

    /**
     * Método que carrega todas as classes existentes no banco
     *
     * @return ArrayList com todas as classes
     */
    public List<Classe> listarClasses() {
        classes = dao.listarClasses();
        return classes;
    }

    /**
     * Método que carrega todas as reças vindas do banco de dados em um
     * selectOneMenu
     *
     * @return ArrayList com todas as raças
     */
    public List<Raca> listarRacas() {
        racas = dao.listarRacas();
        return racas;
    }

    public List<Personagem> listarPersonagens() {
        personagens = dao.listar();

        return personagens;
    }

    public String editarPersonagem() {

        String outcome;
        outcome = "ATUALIZAR";
        return outcome;
    }

    public String deletarPersonagem() {
        String outcome = null;
        if (dao.remover(personagem)) {
            outcome = "DELETADO";
        }
        return outcome;

    }

    public String atualizarPersonagem(Personagem personagem) {
        this.personagem = personagem;
        String outcome = null;

        if (dao.atualizar(personagem)) {
            outcome = "ATUALIZADO";
        }

        return outcome;
    }

    public void limpar() {
        if (personagem != null) {
            personagem = null;
        }
    }
}

Bom o que esta acontecendo é o seguinte, do jeito que esta atualmente, ele abre o dialog, porem ele nao vem com nenhum dado

agradeço qualquer ajuda: abraços

10 Respostas

drsmachado

Já pensou em usar um DataModel no lugar da List para preencher os dados da datatable?

diogoprosoft

Com DataModel tudo fica mais fácil!

http://www.primefaces.org/showcase/ui/datatableRowSelectionRadioCheckbox.jsf

gmmascarin

Coloque : em update=":detalhesPainel".

J

Show de bola hehe, vou tentar aqui :smiley: jaja posto o resultado
valew

gmmascarin

Acabei de testar aqui e funcionou. Coloque <h:form> também.

&lt;html xmlns="http://www.w3.org/1999/xhtml"  
      xmlns:p="http://primefaces.org/ui"  
      xmlns:f="http://java.sun.com/jsf/core"  
      xmlns:ui="http://java.sun.com/jsf/facelets"  
      xmlns:h="http://java.sun.com/jsf/html"&gt;  
    &lt;h:head&gt;  
        &lt;title&gt;&lt;/title&gt;  
    &lt;/h:head&gt;  
  
    &lt;!--Página responsável pelo cadastro dos personagens do jogador --&gt;  
    &lt;ui:composition template="/template/template.xhtml"&gt;  
  
        &lt;ui:define name="conteudo"&gt;  
           &lt;h:form id="form"&gt;
            &lt;div&gt;  
                &lt;p:dataTable value="#{personagemMB.listarPersonagens()}" var="personagem" paginator="true" rows="3"&gt;  
                    &lt;f:facet name="header"&gt;  
                        Lista de Personagens  
                    &lt;/f:facet&gt;  
  
                    &lt;p:column headerText="Nome"&gt;  
                        &lt;h:outputText value="#{personagem.nome}"/&gt;  
                    &lt;/p:column&gt;  
                      
                    &lt;p:column headerText="Classe"&gt;  
                        &lt;h:outputText value="#{personagem.classe}"/&gt;  
                    &lt;/p:column&gt;  
                      
                    &lt;p:column headerText="Raça"&gt;  
                        &lt;h:outputText value="#{personagem.raca}"/&gt;  
                    &lt;/p:column&gt;  
                      
                    &lt;p:column headerText="Alterar"&gt;  
                        &lt;p:commandButton id="selectButton" update=":form:detalhesPainel" onclick="personagem.show()" icon="ui-icon-search" title="View"&gt;  
			        &lt;f:setPropertyActionListener value="#{personagem}" target="#{personagemMB.personagemSelecionado}" /&gt;  
			 &lt;/p:commandButton&gt;  
                    &lt;/p:column&gt;  
                  
                &lt;/p:dataTable&gt;   
  
                &lt;p:dialog header="Detalhes / Alterar" widgetVar="personagem" resizable="false" id="personagemDialog" showEffect="fade"  
                          hideEffect="explode" &gt;  
  
                    &lt;p:panelGrid id="detalhesPainel" columns="2"&gt;  
                        &lt;h:outputText value="Nome" /&gt;  
                        &lt;h:outputText value="#{personagemMB.personagemSelecionado.nome}"/&gt;  
                    &lt;/p:panelGrid&gt;  
  
                &lt;/p:dialog&gt;  
  
            &lt;/div&gt;  
            &lt;/h:form&gt;
        &lt;/ui:define&gt;  
  
    &lt;/ui:composition&gt;  
  
&lt;/html&gt;
J

cara, coloquei o h:form e mudei o update tb
porém meu dialog abre, mas não puxa o dado da linha do botao que eu clico
Os valores estão vindo vazio

gmmascarin

Executei aqui e funcionou, a única diferença é que não usei template. Faz um clean no seu projeto (Project >> Clean) e certifique que seu template não possua a tag <h:form>.

gmmascarin

Segue meu código completo, sem template.

&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;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.org/ui"&gt;
&lt;f:view contentType="text/html"&gt;
	&lt;h:head&gt;
		&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;
		&lt;title&gt;&lt;h:outputText value="#{msg['titulo']}" /&gt;&lt;/title&gt;
		&lt;link type="text/css" rel="stylesheet"
			href="#{request.contextPath}/resources/css/estilo.css" /&gt;
	&lt;/h:head&gt;
	&lt;h:body&gt;
	&lt;h:form id="form"&gt;
	  &lt;div&gt;  
                &lt;p:dataTable value="#{personagemMB.listarPersonagens()}" var="personagem" paginator="true" rows="3"&gt;  
                    &lt;f:facet name="header"&gt;  
                        Lista de Personagens  
                    &lt;/f:facet&gt;  
  
                    &lt;p:column headerText="Nome"&gt;  
                        &lt;h:outputText value="#{personagem.nome}"/&gt;  
                    &lt;/p:column&gt;  
                      
                    &lt;p:column headerText="Classe"&gt;  
                        &lt;h:outputText value="#{personagem.nome}"/&gt;  
                    &lt;/p:column&gt;  
                      
                    &lt;p:column headerText="Raça"&gt;  
                        &lt;h:outputText value="#{personagem.nome}"/&gt;  
                    &lt;/p:column&gt;  
                      
                    &lt;p:column headerText="Alterar"&gt;  
                        &lt;p:commandButton id="selectButton" update=":form:detalhesPainel" onclick="personagem.show();" icon="ui-icon-search" title="Alterar"&gt;  
			                &lt;f:setPropertyActionListener value="#{personagem}" target="#{personagemMB.personagemSelecionado}" /&gt;  
			            &lt;/p:commandButton&gt;  
  
                    &lt;/p:column&gt;  
                  
                &lt;/p:dataTable&gt;   
  
                &lt;p:dialog header="Detalhes / Alterar" widgetVar="personagem" resizable="false" id="personagemDialog" showEffect="fade"  
                          hideEffect="explode" &gt;  
  
                    &lt;p:panelGrid id="detalhesPainel" columns="2"&gt;  
                        &lt;h:outputText value="Nome" /&gt;  
                        &lt;h:outputText value="#{personagemMB.personagemSelecionado.nome}"/&gt;  
                    &lt;/p:panelGrid&gt;  
  
                &lt;/p:dialog&gt;  
  
            &lt;/div&gt;  
            &lt;/h:form&gt;
            &lt;/h:body&gt;
&lt;/f:view&gt;
&lt;/html&gt;
package br.com.linestetic.sisgestao.mb;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

import br.com.linestetic.sisgestao.model.Usuario;
  
/** 
* 
* @author jilles ragonha 
*/  
@ManagedBean  
@RequestScoped  
public class PersonagemMB implements Serializable {  
  
    private Usuario personagemSelecionado;  
   
    public Usuario getPersonagemSelecionado() { 
        return personagemSelecionado;  
    }  
  
    public void setPersonagemSelecionado(Usuario personagemSelecionado) {
        this.personagemSelecionado = personagemSelecionado;  
    } 
    public List&lt;Usuario&gt; listarPersonagens() {  
        List&lt;Usuario&gt; l = new ArrayList&lt;&gt;();
        Usuario u = new Usuario();
        u.setNome("Raul Seixas");
        l.add(u);
        return l;
    }  
}
J

he, novamente nada, ele abre o dialog mas ainda não aparece nenhum valor

:frowning:

J

UOWEWWWWWWWWWW
funfo

ahuhuahuahuahua
Kara, muitissimo obrigado pela ajuda

virei seu fã ehheeh
abraços e brigadão msm

Criado 12 de março de 2013
Ultima resposta 12 de mar. de 2013
Respostas 10
Participantes 4