[RESOLVIDO] <a4j:support reRender=""> Não estão funcionando

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.



&lt;h:selectBooleanCheckbox  id="id_externo" value="#{movimentacaoMBean.externo}" &gt;
				&lt;a4j:support reRender="painel_orgao_externo" event="onclick" /&gt;
				&lt;/h:selectBooleanCheckbox&gt;
			
			
				&lt;h:panelGroup id="painel_orgao_externo" rendered="#{movimentacaoMBean.externo}"&gt;
				&lt;h:outputLabel value="Orgao externo" id="lb_orgaoexterno" /&gt;
				&lt;h:selectOneMenu value="#{movimentacaoMBean.orgaoExterno.cdOrgao}" id="codOrgao" &gt;
					  &lt;f:selectItem itemLabel="" /&gt;
						&lt;f:selectItems value="#{movimentacaoMBean.listaDeOrgsExternos}" /&gt;
					&lt;/h:selectOneMenu&gt;
				&lt;/h:panelGroup&gt;

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:

 &lt;a4j:support reRender="painel_orgao_externo" event="onclick" actionListener="setaTrue" /&gt;  

e no MB:

public void setaTrue(ActionEvent evt){
externo = true;
}

Não funfou não mano. =/

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:


&lt;h:panelGroup &gt;
				&lt;h:outputLabel value="Externo"/&gt;
				&lt;h:selectBooleanCheckbox  id="id_externo" value="#{movimentacaoMBean.externo}" &gt;
				&lt;a4j:support reRender="painel_orgao_externo" event="onclick" /&gt;
				&lt;/h:selectBooleanCheckbox&gt;
			<br />
			
				&lt;h:panelGroup id="painel_orgao_externo" rendered="#{movimentacaoMBean.externo}"&gt;
				&lt;h:outputLabel value="Orgao externo" id="lb_orgaoexterno" /&gt;
				&lt;h:selectOneMenu value="#{movimentacaoMBean.orgaoExterno.cdOrgao}" id="codOrgao" &gt;
					  &lt;f:selectItem itemLabel="" /&gt;
						&lt;f:selectItems value="#{movimentacaoMBean.listaDeOrgsExternos}" /&gt;
					&lt;/h:selectOneMenu&gt;
				&lt;/h:panelGroup&gt;
			&lt;/h:panelGroup&gt;
				

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:


&lt;h:panelGroup id="painel_orgao_pai"&gt;
				&lt;h:outputLabel value="Externo"/&gt;
				&lt;h:selectBooleanCheckbox  id="id_externo" value="#{movimentacaoMBean.externo}" &gt;
				&lt;a4j:support reRender="painel_orgao_externo" event="onclick"
				ajaxSingle="true" actionListener="#{movimentacaoMBean.setaTrue}"/&gt;
				&lt;/h:selectBooleanCheckbox&gt;
			    <br />
			
				   &lt;h:panelGroup id="painel_orgao_externo" &gt;
				      &lt;h:outputLabel value="Orgao externo" id="lb_orgaoexterno" rendered="#{movimentacaoMBean.externo}"/&gt;
				        &lt;h:selectOneMenu value="#{movimentacaoMBean.orgaoExterno.cdOrgao}" id="codOrgao" rendered="#{movimentacaoMBean.externo}" &gt;
					      &lt;f:selectItem itemLabel="" /&gt;
						  &lt;f:selectItems value="#{movimentacaoMBean.listaDeOrgsExternos}" /&gt;
					  &lt;/h:selectOneMenu&gt;
				&lt;/h:panelGroup&gt;
			&lt;/h:panelGroup&gt;

Onde o método setaTrue



	 public void setaTrue(ActionEvent evt){ 
		 this.externo = true;  
		}

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.

coloquei o saveState…

e nada… novamente.

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]

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.


	&lt;h:panelGroup id="painel_orgao_pai"&gt;
				&lt;h:outputLabel value="Externo"/&gt;
				&lt;h:selectBooleanCheckbox  id="id_externo" value="#{movimentacaoMBean.externo}" &gt;
				&lt;a4j:support reRender="painel_orgao_pai" event="onclick"
				ajaxSingle="true" action="#{movimentacaoMBean.setaTrue}"/&gt;
				&lt;/h:selectBooleanCheckbox&gt;
			    <br />
			
				   &lt;h:panelGroup id="painel_orgao_externo" &gt;
				      &lt;h:outputLabel value="Orgao externo" id="lb_orgaoexterno" rendered="#{movimentacaoMBean.externo}"/&gt;
				        &lt;h:selectOneMenu value="#{movimentacaoMBean.orgaoExterno.cdOrgao}" id="codOrgao" rendered="#{movimentacaoMBean.externo}" &gt;
					      &lt;f:selectItem itemLabel="" /&gt;
						  &lt;f:selectItems value="#{movimentacaoMBean.listaDeOrgsExternos}" /&gt;
					  &lt;/h:selectOneMenu&gt;
				&lt;/h:panelGroup&gt;
			&lt;/h:panelGroup&gt;

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.


	&lt;h:panelGroup id="painel_orgao_pai"&gt;
				&lt;h:outputLabel value="Externo"/&gt;
				&lt;h:selectBooleanCheckbox  id="id_externo" value="#{movimentacaoMBean.externo}" &gt;
				&lt;a4j:support reRender="painel_orgao_pai" event="onclick"
				ajaxSingle="true" actionListener="#{movimentacaoMBean.setaTrue}" /&gt;
				&lt;/h:selectBooleanCheckbox&gt;
			    <br />
			&lt;t:saveState value="#{movimentacaoMBean.externo}"/&gt;
				   &lt;h:panelGroup id="painel_orgao_externo" &gt;
				      &lt;h:outputLabel value="Orgao externo" id="lb_orgaoexterno" rendered="#{movimentacaoMBean.externo}"/&gt;
				        &lt;h:selectOneMenu value="#{movimentacaoMBean.orgaoExterno.cdOrgao}" id="codOrgao" rendered="#{movimentacaoMBean.externo}" &gt;
					      &lt;f:selectItem itemLabel="" /&gt;
						  &lt;f:selectItems value="#{movimentacaoMBean.listaDeOrgsExternos}" /&gt;
					  &lt;/h:selectOneMenu&gt;
				&lt;/h:panelGroup&gt;
			&lt;/h:panelGroup&gt;

método do MB:


 public void setaTrue(ActionEvent evt){ 
		 this.setExterno(true);  
		}