Alguem se dispoe a tirar algumas duvidas sobre richfaces, mais especificamente o ajaxkeys, andei fazendo alguns exemplos, mas ainda não ta muito claro o funcionamento dele pra min …
se alguem se dispor … poste aki ^^
grato
Alguem se dispoe a tirar algumas duvidas sobre richfaces, mais especificamente o ajaxkeys, andei fazendo alguns exemplos, mas ainda não ta muito claro o funcionamento dele pra min …
se alguem se dispor … poste aki ^^
grato
Poste sua dúvida 
guimoz Veja axo q pode te ajudar…
http://www.juntadeandalucia.es/xwiki/bin/view/MADEJA/RichFaces
T+
vamo la hehe
seguinte, fiz alguns exemplos, e tentei implementar algumas variaçoes dos originais, so pra n fik naquela coisa chata de sempre seguir a risca os exemplos ...
entao ... no exemplo, tem uma lista, estatica, que é carregada 1 unica vez, qnd o mb é carregado pela primeira vez, atravez da @PostConstruct, é um ArrayList, nesste mesmo metodo é criado uma instancia de um Set, Set set = new HashSet
ate ai tdo bem...
em cada linha da datatable, tenho um botao que aciona um modalpanel, do richfaces, que atualizaria os dados, exemplo:
digamos q eu tenha uma linha com o nome e telefone, qnd eu clicar no botao editar, ele traz o modal com as informaçoes da respectiva linha...
o problema vem agora, se eu usar como no exemplo, uma lista estatica, ele funciona, ele "salva", as informaçoes que foram mudadas, em tempo de execução, dando submit somente na linha q foi alterada, sem ter q dar reload na tabela inteira, consequentemente na tela.
so q, como eu disse antes, fiz uma variação disso xD, na verdade 2, fiz um metodo q retorna um list, tb com lista estatica, e um com um metodo q retorna uma list do banco, em ambas variaçoes, ao executar o metodo de salvar, o item n é atualizado na tela ....
segue os fontes ..
o jsp ..<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://richfaces.org/rich" prefix="rich"%>
<html>
<f:view>
<head>
<title>RichFaces</title>
</head>
<body>
<h:form>
<rich:panel header="Usuarios">
<rich:dataTable value="#{userBean.users}" var="user"
ajaxKeys="#{userBean.rowsToUpdate}">
<h:column>
<a4j:commandButton value="Edit"
oncomplete="#{rich:component('useredit')}.show()"
reRender="userinfo">
<f:setPropertyActionListener value="#{user}"
target="#{userBean.selectedUser}" />
</a4j:commandButton>
</h:column>
<h:column>
<h:outputText id="name" value="#{user.name}"/>
</h:column>
<h:column>
<h:outputText id="email" value="#{user.email}"/>
</h:column>
</rich:dataTable>
</rich:panel>
</h:form>
<a4j:keepAlive beanName="userBean"/>
<rich:modalPanel id="useredit" label="Usuario">
<h:form>
<h:panelGrid id="userinfo">
<h:outputLabel for="nameInput" value="Name:"/>
<h:inputText id="nameInput" value="#{userBean.selectedUser.name}"/>
<h:outputLabel for="emailInput" value="Email:"/>
<h:inputText id="emailInput" value="#{userBean.selectedUser.email}"/>
<h:panelGrid columns="2">
<a4j:commandLink onclick="#{rich:component('useredit')}.hide();return false">
Close
</a4j:commandLink>
<a4j:commandLink actionListener="#{userBean.save}"
oncomplete="#{rich:component('useredit')}.hide()"
reRender="name, email">
Save
</a4j:commandLink> </h:panelGrid>
</h:panelGrid>
</h:form>
</rich:modalPanel>
</body>
</f:view>
</html>
package example.model;
import java.io.Serializable;
public class User implements Serializable {
private String name;
private String email;
public User() {
}
public User(String name, String email) {
super();
this.name = name;
this.email = email;
}
@Override
public String toString() {
return name + " " + email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
package example.beans;
import example.dao.UserDAO;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import example.model.User;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.faces.event.ActionEvent;
public class UserBean implements Serializable {
private List<User> users;
private User selectedUser;
private Set<Integer> rowsToUpdate;
private UserDAO udao = new UserDAO();
public List<User> getUsers() throws SQLException {
users = udao.getUsers();
rowsToUpdate = new HashSet<Integer>();
return users;
}
public void save(ActionEvent event) {
System.out.println(selectedUser.getName());
System.out.println(users.toString());
System.out.println(users.indexOf(selectedUser));
System.out.println(users.contains(selectedUser));
getRowsToUpdate().add(users.indexOf(selectedUser));
}
public User getSelectedUser() {
return selectedUser;
}
public void setSelectedUser(User selectedUser) {
this.selectedUser = selectedUser;
}
public Set<Integer> getRowsToUpdate() {
return rowsToUpdate;
}
public void setUsers(List<User> users) {
this.users = users;
}
}
ps: n entendi direito o uso do ajaxkeys, sendo mais expecifico, n entendi o pq da linha em q é addicionado no rowstoupdate( getRowsToUpdate().add(users.indexOf(selectedUser)););
talvez a soluçao pro meu problema seja fzer um overide do equals e do hashcode, ja q na linha em q eu printo o indexof, retorna -1, ou seja n encontra o objeto, mas a maior duvida ta no ajaxkeys msm …
bom ja fiz o exemplo funcionar, a solução era implementar o hascode, equals, e usar 2 obejtos para comparação um somente para comparação e outro para realmente guardar as modificações …
ps: o ajaxkeys funciona como um indice para sua tabela …
Ola pessoal,
Para quem estar sofrendo com este problema utilizei a propriedade row da datatable para informa ao set qual linha ele deverá utlizar:
Alguns trechos:
Na view:<t:saveState value="#{destinoController.dataTableDestino.currentRow}"/>
...
<rich:dataTable sortMode="multi" rowKeyVar="row" ajaxKeys="#{empresaController.dataTableEmpresa.updateRowByAjax}"
value="#{empresaController.dataTableEmpresa.listaProcuraDeEmpresa}" var="emp"
rows="10" id="tableEmpresa" width="100%" rendered="#{not empty empresaController.dataTableEmpresa.listaProcuraDeEmpresa }">
...
BOTOES DE LINK(ACOES) DA TABELA:
...
<a4j:commandLink id="linkEditar" action="#{empresaController.dataTableEmpresa.copiarObjEmpresa}" title="Editar Empresa" ajaxSingle="true" immediate="true" reRender="panelEditarEmp" >
<h:graphicImage style="border:none;" value="../MyImgs/edit2.gif"></h:graphicImage>
<f:setPropertyActionListener target="#{empresaController.dataTableEmpresa.empresaSelecionada }" value="#{emp}" />
<f:setPropertyActionListener target="#{empresaController.dataTableEmpresa.currentRow }" value="#{row}" />
<rich:componentControl for="modalPanelEditar" attachTo="linkEditar" operation="show" event="onclick"></rich:componentControl>
</a4j:commandLink>
...
NO MODAL PANEL(Editar):
...
<a4j:commandButton id="buttonAtualizar" type="submit" styleClass="buttonGeneric" value="Atualizar" reRender="[b]IdDaEmpresa, NomeEmpresa[/b], columnButtons, controleFechar, panelControlsModal" actionListener="#{empresaController.atualizarEmpresa }" disabled="#{empresaController.dataTableEmpresa.atualizado }" style="#{empresaController.dataTableEmpresa.atualizado ? 'color: gray;' : ''}"/>
...
EM empresaController.java:
...
this.getDataTableEmpresa().getUpdateRowByAjax().add(this.getDataTableEmpresa().getCurrentRow());
...
Em dataTableEmpresa.java:
...
private Integer currentRow;
private Set<Integer> updateRowByAjax;
public Set<Integer> getUpdateRowByAjax() {
if(this.updateRowByAjax == null){
this.updateRowByAjax = new HashSet<Integer>();
}
return updateRowByAjax;
}
att,
Leonardo Couto Conrado.
Uma pergunta caro amigo leonardocoutoc
Realizei estes exemplos aqui listados mas a minha tabela não atualiza após o update de uma linha…tenho que mandar atualizar pelo codigo java???
é este o código que atualiza a linha apenas da tabela???
this.getDataTableEmpresa().getUpdateRowByAjax().add(this.getDataTableEmpresa().getCurrentRow());
Desculpem a minha ignorância…estou estudando rich faces agora…
Na verdade não consigo fazer com que apenas a linha alterada da tabela mude…por favor me ajudem…Obrigado!
Consegui resolver…esqueci de colocar o atributo id nos output text das tabelas e por isso o botão do modal panel não conseguia dar o reRender na tabela…
Tenho outra dúvida…O meu exemplo está funcionando perfeitamente mas quando vou EXCLUIR uma linha da tabela ele da reRender na table livlist e perde a formatação que é colocada pela tag <rich:jQuery e a tabela deixa de ser zebrada…Alguém sabe me dizer o que fazer para que isso não aconteça…Obrigado!!!
<%@ page language="java" contentType="text/html"
pageEncoding="ISO-8859-1"%>
<%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<!-- RichFaces tag library declaration -->
<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j"%>
<%@ taglib uri="http://richfaces.org/rich" prefix="rich"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<link href="css/estilos.css" rel="stylesheet" />
<style type="text/css">
.odd-row {
background-color: #ECF3FE;
}
.even-row {
background-color: #FCFFFE;
}
.active-row {
background-color: #FFEBDA;
}
</style>
<title>Mostrar Livros</title>
</head>
<body>
<div align="left"><b>CRUD com Hibernate, JSF e Rich Faces</b></div><br>
<f:view>
<h:messages />
<h:form>
<a4j:region>
<rich:dataTable width="483" id="livList" sortMode="multi"
value="#{livrosView2.todosLivros}"
rows="20"
rowKeyVar="row"
var="item"
ajaxKeys="#{livrosView2.keys}">
<f:facet name="header">
<rich:columnGroup>
<h:column><h:outputText value="ISBN"/></h:column>
<h:column><h:outputText value="Título"/></h:column>
<h:column><h:outputText value="Publicado em"/></h:column>
<h:column><h:outputText value="Alterar"/></h:column>
<h:column><h:outputText value="Excluir"/></h:column>
</rich:columnGroup>
</f:facet>
<h:column>
<h:outputText id="isbn" value="#{item.isbn}" />
</h:column>
<h:column>
<h:outputText id="titulo" value="#{item.titulo}" />
</h:column>
<h:column>
<h:outputText id="publicacao" value="#{item.publicacao}" />
</h:column>
<rich:column>
<a4j:commandLink ajaxSingle="true" id="editlink"
oncomplete="#{rich:component('editPanel')}.show()">
<h:graphicImage value="imagens/edit.gif" style="border:0"/>
<f:setPropertyActionListener value="#{item}"
target="#{livrosView2.currentItem}" />
<f:setPropertyActionListener value="#{row}"
target="#{livrosView2.currentRow}" />
<rich:componentControl for="modalPanelEditar" attachTo="editlink"
operation="show" event="onclick"/>
</a4j:commandLink>
<rich:toolTip for="editlink" value="Editar"/>
</rich:column>
<rich:column>
<a4j:commandLink ajaxSingle="true" id="deletelink"
oncomplete="#{rich:component('deletePanel')}.show()">
<h:graphicImage value="imagens/delete.gif" style="border:0"/>
<f:setPropertyActionListener value="#{item}"
target="#{livrosView2.currentItem}" />
<f:setPropertyActionListener value="#{row}"
target="#{livrosView2.currentRow}" />
</a4j:commandLink>
<rich:toolTip for="deletelink" value="Excluir"/>
</rich:column>
<f:facet name="footer">
<rich:datascroller renderIfSinglePage="false" maxPages="5"/>
</f:facet>
</rich:dataTable >
<rich:jQuery selector="#livList tr:odd" query="addClass('odd-row')" />
<rich:jQuery selector="#livList tr:even" query="addClass('even-row')" />
<rich:jQuery selector="#livList tr"
query="mouseover(function(){jQuery(this).addClass('active-row')})"/>
<rich:jQuery selector="#livList tr"
query="mouseout(function(){jQuery(this).removeClass('active-row')})"/>
<br/>
</a4j:region>
</h:form>
<a4j:keepAlive beanName="livrosView2"/>
<rich:modalPanel id="editPanel" autosized="true" width="450">
<f:facet name="header">
<h:outputText value="Editando Livro" />
</f:facet>
<f:facet name="controls">
<h:panelGroup>
<h:graphicImage value="imagens/close2.gif"
id="hidelink" styleClass="hidelink"/>
<rich:componentControl for="editPanel" attachTo="hidelink"
operation="hide" event="onclick" />
</h:panelGroup>
</f:facet>
<h:form>
<rich:messages style="color:red;"></rich:messages>
<h:panelGrid columns="1">
<a4j:outputPanel ajaxRendered="true">
<h:panelGrid columns="2">
<h:outputText value="ID"/>
<h:inputText readonly="true" value="#{livrosView2.currentItem.idlivro}"/>
<h:outputText value="ISBN" />
<h:inputText value="#{livrosView2.currentItem.isbn}" />
<h:outputText value="Título" />
<h:inputText value="#{livrosView2.currentItem.titulo}" />
<h:outputText value="Edição" />
<h:inputText value="#{livrosView2.currentItem.edicao}" />
<h:outputText value="Publicação" />
<h:inputText value="#{livrosView2.currentItem.publicacao}" />
<h:outputText value="Descricao" />
<h:inputTextarea value="#{livrosView2.currentItem.descricao}" />
</h:panelGrid>
</a4j:outputPanel>
<a4j:commandButton value="Salvar"
action="#{livrosView2.update}"
reRender="isbn,titulo,publicacao"
oncomplete="if (#{facesContext.maximumSeverity==null}) #{rich:component('editPanel')}.hide();" />
</h:panelGrid>
</h:form>
</rich:modalPanel>
<rich:modalPanel id="deletePanel" autosized="true" width="200">
<f:facet name="header">
<h:outputText value="Deseja deletar realmente este livro?"
style="padding-right:15px;" />
</f:facet>
<f:facet name="controls">
<h:panelGroup>
<h:graphicImage value="imagens/close2.gif"
styleClass="hidelink" id="hidelink2" />
<rich:componentControl for="deletePanel" attachTo="hidelink2"
operation="hide" event="onclick" />
</h:panelGroup>
</f:facet>
<h:form>
<table width="100%">
<tbody>
<tr>
<td align="center" width="50%">
<a4j:commandButton value="Sim" ajaxSingle="true"
action="#{livrosView2.delete}"
oncomplete="#{rich:component('deletePanel')}.hide();"
reRender="livList" />
</td>
<td align="center" width="50%">
<a4j:commandButton value="Não"
onclick="#{rich:component('deletePanel')}.hide();return false;" />
</td>
</tr>
</tbody>
</table>
</h:form>
</rich:modalPanel>
<a4j:status onstart="#{rich:component('wait')}.show()" onstop="#{rich:component('wait')}.hide()"/>
<rich:modalPanel id="wait" autosized="true" width="200" height="120" moveable="false" resizeable="false">
<f:facet name="header">
<h:outputText value="Processing"/>
</f:facet>
<h:outputText value="Wait Please..."/>
</rich:modalPanel>
<rich:messages></rich:messages>
</f:view>
</body>
</html>