Bom dia pessoal,
andei lendo varios post e na maioria dizia que se vc quer ter um render dinamico, vc precisa renderizar o componente pai daquele componente a ser renderizando. Pensando nessa linha de raciocinio, eu estou tentando renderizar um panelgroup e n consegui. Tentei também com um a4j:outPanel e também não consegui. abaixo o código.
<h:selectBooleanCheckbox id="id_externo" value="#{movimentacaoMBean.externo}" >
<a4j:support reRender="painel_orgao_externo" event="onclick" />
</h:selectBooleanCheckbox>
<h:panelGroup id="painel_orgao_externo" rendered="#{movimentacaoMBean.externo}">
<h:outputLabel value="Orgao externo" id="lb_orgaoexterno" />
<h:selectOneMenu value="#{movimentacaoMBean.orgaoExterno.cdOrgao}" id="codOrgao" >
<f:selectItem itemLabel="" />
<f:selectItems value="#{movimentacaoMBean.listaDeOrgsExternos}" />
</h:selectOneMenu>
</h:panelGroup>
Eu estou tentando renderizar o componente “painel_orgao_externo”, através de um selectbox. Alguém saberia porque não está funcionando ?
esse rendered="#{movimentacaoMBean.externo}" tá true?
ele inicia false.
ele seria alterado conforme o evento “onclick” fosse chamado.
entendi…
então vc precisa de algo assim:
<a4j:support reRender="painel_orgao_externo" event="onclick" actionListener="setaTrue" />
e no MB:
public void setaTrue(ActionEvent evt){
externo = true;
}
Você só pode fazer reRender em um componente que inicialmente está renderizado.
Ele precisa existir no HTML original (mesmo que seja um Panel vazio) para que as chamadas Ajax modifiquem o conteúdo.
A solução é criar um panel group PAI do painel_orgao_externo, sem o atributo rendered.
<h:panelGroup id="id_do_painel_pai">
<h:panelGroup id="painel_orgao_externo" rendered="#{movimentacaoMBean.externo}">
...
</h:panelGroup>
</h:panelGroup>
Aí o componente Ajax faz reRender no id_do_painel_pai
Não sei se fui bem claro, qualquer coisa é só perguntar
fiz dessa forma e também não funcionou:
<h:panelGroup >
<h:outputLabel value="Externo"/>
<h:selectBooleanCheckbox id="id_externo" value="#{movimentacaoMBean.externo}" >
<a4j:support reRender="painel_orgao_externo" event="onclick" />
</h:selectBooleanCheckbox>
<br />
<h:panelGroup id="painel_orgao_externo" rendered="#{movimentacaoMBean.externo}">
<h:outputLabel value="Orgao externo" id="lb_orgaoexterno" />
<h:selectOneMenu value="#{movimentacaoMBean.orgaoExterno.cdOrgao}" id="codOrgao" >
<f:selectItem itemLabel="" />
<f:selectItems value="#{movimentacaoMBean.listaDeOrgsExternos}" />
</h:selectOneMenu>
</h:panelGroup>
</h:panelGroup>
L.Bach
Setembro 16, 2010, 2:10pm
#8
O panelGroup tem algum bug ou alguma definição do Faces, que desconheço, no “rendered” dele, quanto à a4j.
Até funciona, na primeira renderização. Mas quando manda renderizar novamente, via a4j, ele não responde.
Sugiro o seguinte:
[code]
<h:panelGroup >
<h:outputLabel value=“Externo”/>
<h:selectBooleanCheckbox id=“id_externo” value="#{movimentacaoMBean.externo}" >
<a4j:support reRender=“painel_orgao_externo” event=“onclick” />
</h:selectBooleanCheckbox>
<h:panelGroup id="painel_orgao_externo">
<h:outputLabel rendered="#{movimentacaoMBean.externo}" value="Orgao externo" id="lb_orgaoexterno" />
<h:selectOneMenu rendered="#{movimentacaoMBean.externo}" value="#{movimentacaoMBean.orgaoExterno.cdOrgao}" id="codOrgao" >
<f:selectItem itemLabel="" />
<f:selectItems value="#{movimentacaoMBean.listaDeOrgsExternos}" />
</h:selectOneMenu>
</h:panelGroup>
</h:panelGroup> [/code]
Coloca as condições do rendered no outputLabel e no selectOneMenu e continua com com o reRender do a4j:support apontando para o “painel_orgao_externo”.
Abraço
Edit: também precisa acrescentar um método no actionListener do a4j:support, que vai setar “externo” para true ou false, de acordo à necessidade.
vc precisa de um actionListener no a4j:support
senão,como vc vai setar a variável ‘externo’ para true?
fiz dessa forma e tbm não funcionou:
<h:panelGroup id="painel_orgao_pai">
<h:outputLabel value="Externo"/>
<h:selectBooleanCheckbox id="id_externo" value="#{movimentacaoMBean.externo}" >
<a4j:support reRender="painel_orgao_externo" event="onclick"
ajaxSingle="true" actionListener="#{movimentacaoMBean.setaTrue}"/>
</h:selectBooleanCheckbox>
<br />
<h:panelGroup id="painel_orgao_externo" >
<h:outputLabel value="Orgao externo" id="lb_orgaoexterno" rendered="#{movimentacaoMBean.externo}"/>
<h:selectOneMenu value="#{movimentacaoMBean.orgaoExterno.cdOrgao}" id="codOrgao" rendered="#{movimentacaoMBean.externo}" >
<f:selectItem itemLabel="" />
<f:selectItems value="#{movimentacaoMBean.listaDeOrgsExternos}" />
</h:selectOneMenu>
</h:panelGroup>
</h:panelGroup>
Onde o método setaTrue
public void setaTrue(ActionEvent evt){
this.externo = true;
}
L.Bach
Setembro 16, 2010, 2:28pm
#11
Tem getter e setter para este externo?
Além disso, coloca ele em um t:saveState, assim:
<t:saveState value="#{movimentacaoMBean.externo}"/>
Vamos ver se funciona
tem sim.
public void setExterno(boolean externo) {
this.externo = externo;
}
public boolean isExterno() {
return externo;
}
Vou testar utilizando o saveState do tomahawk.
acho que resolvi aqui.
coloca reRender=“painel_orgao_pai”
O que eu estava dizendo era isso:
[code]
<h:selectBooleanCheckbox id=“id_externo” value="#{movimentacaoMBean.externo}" >
<a4j:support reRender=“painel_pai” event=“onclick” />
</h:selectBooleanCheckbox>
<h:panelGroup id="painel_pai">
<h:panelGroup id="painel_orgao_externo" rendered="#{movimentacaoMBean.externo}">
<h:outputLabel value="Orgao externo" id="lb_orgaoexterno" />
<h:selectOneMenu value="#{movimentacaoMBean.orgaoExterno.cdOrgao}" id="codOrgao" >
<f:selectItem itemLabel="" />
<f:selectItems value="#{movimentacaoMBean.listaDeOrgsExternos}" />
</h:selectOneMenu>
</h:panelGroup>
</h:panelGroup> [/code]
Ygor
Setembro 16, 2010, 2:45pm
#16
Boa tarde EuclidesFilizola;
O que está acontecendo é o seguinte, primeiro a sua pagina é montada sem o componente ‘painel_orgao_externo’ pois está com redered=false. Até ai tudo bem;
Então tu faz a modificação no checkbox e envia a requisição ajax, essa requisição ajax ira tentar dar um reRender no componente “painel_orgao_externo”, mas ele não existe(pq não foi renderizado) e ai é que encontra o problema, então tu tem que dar um reRender em um componente superior a ele, que ja tenha sido renderizado anteriormente.
fiz desta forma, e continua sem funcionar, ou seja, ao clicar no selectbox, nada acontece.
<h:panelGroup id="painel_orgao_pai">
<h:outputLabel value="Externo"/>
<h:selectBooleanCheckbox id="id_externo" value="#{movimentacaoMBean.externo}" >
<a4j:support reRender="painel_orgao_pai" event="onclick"
ajaxSingle="true" action="#{movimentacaoMBean.setaTrue}"/>
</h:selectBooleanCheckbox>
<br />
<h:panelGroup id="painel_orgao_externo" >
<h:outputLabel value="Orgao externo" id="lb_orgaoexterno" rendered="#{movimentacaoMBean.externo}"/>
<h:selectOneMenu value="#{movimentacaoMBean.orgaoExterno.cdOrgao}" id="codOrgao" rendered="#{movimentacaoMBean.externo}" >
<f:selectItem itemLabel="" />
<f:selectItems value="#{movimentacaoMBean.listaDeOrgsExternos}" />
</h:selectOneMenu>
</h:panelGroup>
</h:panelGroup>
em vez de:
action="#{movimentacaoMBean.setaTrue}"
deve ser:
actionListener="#{movimentacaoMBean.setaTrue}"
retificando,testei aqui e tbm funciona com action.
vc debugou?tá entrando no método setaTrue ?
mesmo tendo mudado para actionListener, continua sem funcionar.
<h:panelGroup id="painel_orgao_pai">
<h:outputLabel value="Externo"/>
<h:selectBooleanCheckbox id="id_externo" value="#{movimentacaoMBean.externo}" >
<a4j:support reRender="painel_orgao_pai" event="onclick"
ajaxSingle="true" actionListener="#{movimentacaoMBean.setaTrue}" />
</h:selectBooleanCheckbox>
<br />
<t:saveState value="#{movimentacaoMBean.externo}"/>
<h:panelGroup id="painel_orgao_externo" >
<h:outputLabel value="Orgao externo" id="lb_orgaoexterno" rendered="#{movimentacaoMBean.externo}"/>
<h:selectOneMenu value="#{movimentacaoMBean.orgaoExterno.cdOrgao}" id="codOrgao" rendered="#{movimentacaoMBean.externo}" >
<f:selectItem itemLabel="" />
<f:selectItems value="#{movimentacaoMBean.listaDeOrgsExternos}" />
</h:selectOneMenu>
</h:panelGroup>
</h:panelGroup>
método do MB:
public void setaTrue(ActionEvent evt){
this.setExterno(true);
}