Pegar valor da linha selecionada rich:datatable

15 respostas
francis.junio

Boa tarde galera guj.
Estou precisando pegar o valor da linha quando eu clico em qualquer lugar na linha da tabela. Eu utilizo rich:datatable e eu popula minha table com um List e um ListDataModel que recebe essa lista de Departamentos. Se eu crio uma coluna com um commandLink e no meu bean eu faço um cast eu consigo disparar o metodo do bean e pegar o valor, por exemplo:

Departamento dp = (Departamento)dataModel.getRowData();

Mas, eu nao posso criar uma coluna com comandlink nessa tela. Eu preciso é clicar na linha e disparar o metodo que tem o codigo acima com a linha selecionada.
OBS.: eu tentei utilizar o <a4j:support action="#{pesquisaDepartment.selectItem}" event=“onclick”/>, mas nao deu certo.
Se alguem puder me ajudar, agradeço desde ja.

abraços…

15 Respostas

francis.junio

Alguem pode ajudar como pegar o valor da linha somente clicando na linha gente?

francis.junio

Boa tarde galera. Eu consegui resolver o meu problema em outro post.

http://www.guj.com.br/posts/list/0/137672.java#1068015

Eu estava no caminho certo, porem com o evento errado.

Ao indes de:

<a4j:support action="#{pesquisaDepartment.selectItem}" event="onclick"/>

Coloquei assim e consegui pegar o valor da linha

<a4j:support event="onRowClick" action="#{pesquisaDepartment.getRowSelected}"/>

Fica a dica para quem precisar.

F

Dae cara blz?

Estou com o mesmo problema e fiz como você falou, mais não funciona, segue código:
<a4j:form>
        <div style="height: 200px;width: 500px;overflow: auto">
            <rich:dataTable id="tabelaUsuario" value="#{usuarioMB.listaUsuario}" var="usuario" width="500"
                    onRowMouseOver="this.style.backgroundColor='#BFDFEA'"
                    onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'">

                <a4j:support event="onRowClick" actionListener="#{usuarioMB.pegarUsuario}" />

            <rich:column sortBy="#{usuario.nome}">
                <f:facet name="header">
                Nome
                </f:facet>
                <h:outputText value="#{usuario.nome}"/>
            </rich:column>
           </rich:dataTable>
</div>
</a4j:form>
MB:
public void pegarUsuario(ActionListener e){
        System.out.println(usuario.getNome());
    }

Grato.

francis.junio
Vei Algumas perguntas

Voce ta populando sua table com um ListDataModel(List list)??

Quando vc clica na linha, pelo menos chama o metodo?

Caso suas duas respostas acima seja sim, vc deve pegar o objeto assim:

public void pegarUsuario(ActionListener e){

Usuario usuario = (Usuario) dataModel.getRowData();

}

Caso nao seja assim, responda como vc carregando seu objeto e se pelo menos chama o metodo.

at+

F

Cara seguinte…

Voce ta populando sua table com um ListDataModel(List list)??

Estou usando um List segue o codigo:

public List<Usuario> listarTodosUsuarios(){ UsuarioFacade usuarioService = new UsuarioFacadeImp(); this.listaUsuario = usuarioService.listarTodosUsuarios(); return this.listaUsuario; }

Quando vc clica na linha, pelo menos chama o metodo?

Não =/

francis.junio

Vei faz o seguinte…

Vamos ver se pelo menos o metodo chama…
Ah, a tabela ta sendo popula ne?!

troca os eventos

<a4j:support event="onRowClick" action="#{usuarioMB.pegarUsuario}" />

//NO SEU BEAN VC FAZ ASSIM
public void pegarUsuario(){  
        System.out.println(usuario.getNome());  
    }

Caso vc precise que seja no ActionListener, troque o evento do bean de ActionListener para ActionEvent.
Testa ai e me fala…

F

Cara obrigado pela ajuda.

Ele nem está entrando no método.

Você falou que ele tem que ser um ListDataModel(List list), porque a minha lista é um List normal, e ele esta populando os campos do dataTable.

Segue o código completo:
Usuario usuario = new Usuario();
    List<Usuario> listaUsuario = new ArrayList<Usuario>();

    public UsuarioMB(){
        
    }

    public List<Usuario> listarTodosUsuarios(){
        UsuarioFacade usuarioService = new UsuarioFacadeImp();
        this.listaUsuario = usuarioService.listarTodosUsuarios();
        return this.listaUsuario;
    }

    public void pegarUsuario(){
        System.out.println(usuario.getNome());
    }

/*Get e Set*/
E meu dataTable:
<a4j:form>
        <div style="height: 200px;width: 500px;overflow: auto">
            <rich:dataTable id="tabelaUsuario" value="#{usuarioMB.listaUsuario}" var="usuario" width="500" 
                    onRowMouseOver="this.style.backgroundColor='#BFDFEA'"
                    onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'">

                <a4j:support event="onRowClick" action="#{usuarioMB.pegarUsuario}"/>

            <rich:column sortBy="#{usuario.nome}">
                <f:facet name="header">
                Nome
                </f:facet>
                <h:outputText value="#{usuario.nome}"/>
            </rich:column>

Grato.

francis.junio

te passar um exemplo aki rapidao que vc vai conseguir fazer…marcai

francis.junio
//ISSO SERA SEU BEAM... ESSE dt é quem vai popular sua table na tela...
private DataModel dt;
private List<Usuario> list;

public List<InterfaceFailure> getList() {
		if(list == null)
			list = new ArrayList<Usuario>();
		return list;
	}
public DataModel getDt() {
		dt = new ListDataModel(list);
		return dt;
	}

 public void listarTodosUsuarios(){  
        UsuarioFacade usuarioService = new UsuarioFacadeImp();  
        this.list = usuarioService.listarTodosUsuarios();  
        return this.listaUsuario;  
    } 
public void pegarUsuario(){
Usuario user = (Usuario) dt.getRowData();
}

sua JSP

//aki na sua rich:dataTable vc vai referenciar o dt do seu bean e vai setar uma var = "dt". A var pode ser qualquer coisa q quiser.
<rich:dataTable 
					id="tableUsuario" value="#{usuarioMB.dt}" var="dt" reRender="ds">
<a4j:support event="onRowClick" action="#{usuarioMB.pegarUsuario}" />
					<f:facet name="header">
						<rich:columnGroup>							
							<rich:column>
								<h:outputText value="nome" />
							</rich:column>							
							<rich:column>
								<h:outputText value="usuario" />
							</rich:column>
							
						</rich:columnGroup>
					</f:facet>
					<rich:column>
						<h:outputText value="#{dt.userName}" />
					</rich:column>					
					<rich:column>
						<h:outputText value="#{dt.user}" />
					</rich:column>					
					<f:facet name="footer">
						<rich:datascroller id="ds" renderIfSinglePage="false"></rich:datascroller>
					</f:facet>
				</rich:dataTable>

Vê se vc intende ai vei… No meu projeto aki eu so faço assim e nao tenho problemas.

F

Cara tem como me passar os imports também?

Ele ta dando um erro louco:

SEVERE: Error Rendering View[/listar/listarEvento.xhtml] java.io.NotSerializableException: javax.faces.model.ListDataModel

francis.junio

import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

F

Olha o erro que ta dando:

SEVERE: Error Rendering View[/listar/listarEvento.xhtml] java.io.NotSerializableException: javax.faces.model.ListDataModel at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156) at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509) at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474) at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326) at java.util.HashMap.writeObject(HashMap.java:1000) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945) at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461) at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150) at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1338) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1146) at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1338) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1146) at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1338) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1146) at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1338) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1146) at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1338) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1146) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326) at com.sun.faces.renderkit.ResponseStateManagerImpl.writeState(ResponseStateManagerImpl.java:244) at javax.faces.render.ResponseStateManager.writeState(ResponseStateManager.java:155) at org.ajax4jsf.application.AjaxStateManager.writeState(AjaxStateManager.java:294) at org.ajax4jsf.application.AjaxStateManager.writeState(AjaxStateManager.java:256) at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:620) at org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:100) at org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:176) at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:106) at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251) at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:144) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:245) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178) at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290) at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:368) at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:495) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at br.com.netcontrol.filtro.AuthFilter.doFilter(AuthFilter.java:25) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454) at java.lang.Thread.run(Thread.java:619)

francis.junio

Velho… verifica se seus Imports sao do pacote javax. Utilize somente os imports desse pacote.
Aki no meu sistema, nao tive problemas nenhum.
qq coisa, posta ai.

vlw

M

Você poderia checar se é necessário ou não serializar a classe!

Adiciona um implements serializable nela… testa aí!

francis.junio

Velho… Creio que nao seja isso pq eu nao precisei fazer isso aki… Mas, nao custa fazer o teste…

Criado 14 de junho de 2010
Ultima resposta 30 de ago. de 2010
Respostas 15
Participantes 3