JSF: Renderizando componentes seletivamente com <a4j:support> (SOLUCIONADO)

Bom dia!

Tenho o seguinte problema: há um combo para a seleção do país de origem de uma pessoa. Caso o país de origem seja o Brasil (default), há um combo com os estados para que se selecione a naturalidade. Caso não seja o Brasil, este combo deve desaparecer e, em seu lugar, aparecer um campo para o ano de chegada da pessoa ao Brasil e a sua naturalidade (como input).

As tecnologias utilizadas são JSF/Facelets. Implementei isto com ajax4jsf do seguinte modo:

[code]


País de Origem
<h:selectOneMenu id=“paisOrigem” immediate=“true”
value="#{pessoa.pessoa.paisOrigem}" binding="#{pessoa.paisOrigemSelect}">
<f:selectItems value="#{pato.paisItens}" id=“paisOrigemItens”/>
<a4j:support event=“onchange” reRender=“naturalidadeBrasileiro,infosEstrangeiro”
action="#{pessoa.paisOrigemOnChange}"/>
</h:selectOneMenu>

<h:panelGroup rendered="#{not pessoa.pessoa.estrangeiro}" id=“naturalidadeBrasileiro”
layout=“block”>


Naturalidade




</h:panelGroup>

<h:panelGroup rendered="#{pessoa.pessoa.estrangeiro}" id=“infosEstrangeiro”
layout=“block”>


Ano Chegada

<p>
    <label jsfc="h:outputLabel" for="naturalidadeEstrangeiro">Naturalidade</label>
    <input jsfc="h:inputText" type="text" id="naturalidadeEstrangeiro" 
        maxlength="80" size="40" value="#{pessoa.pessoa.naturalidadeEstrangeiro}" />
</p>

</h:panelGroup>[/code]

O método paisOrigemOnChange() roda a contento no sevidor e altera o resultado do metodo isEstrangeiro(), consultado nos atributos rendered dos dois <h:panelGroup>.

Minha dúvida é: tem algo de errado no que eu fiz? Deixei de fazer algo? Não consegui achar nenhum exemplo disto na web e, lendo a documentação oficial, achei que fosse funcionar.

tenta colocar um panelGroup (ou outro componente) como pai dos panels que você está tentando carregar via ajax e reRerenderizar esse panelGroup

nao funciona colocando direto nos panels pq eles não sendo renderizados não vão estar acessíveis no código html da tela

Funcionou perfeitamente, muito obrigado!!

Rodrigo

Estou tendo o mesmo problema em uma aplicacao aqui.
Você poderia postar o código com a alteracão que você fez para funcionar?
Desde já agradeco.

Aí vai

[code]


País de Origem
<h:selectOneMenu id=“paisOrigem” immediate=“true”
value="#{pessoa.pessoa.paisOrigem}" binding="#{pessoa.paisOrigemSelect}">
<f:selectItems value="#{pato.paisItens}" id=“paisOrigemItens”/>
<a4j:support event=“onchange” reRender=“infosNacionalidade”
action="#{pessoa.paisOrigemOnChange}" id=“ajaxPaisOrigem”/>
</h:selectOneMenu>

<h:panelGroup id=“infosNacionalidade”>

<h:panelGroup rendered="#{not pessoa.pessoa.estrangeiro}" id="naturalidadeBrasileiro"
    layout="block">
    <p>
    <label jsfc="h:outputLabel" for="naturalidade">Naturalidade</label>
    <select jsfc="h:selectOneMenu" id="naturalidade" value="#{pessoa.pessoa.naturalidade}">
        <option jsfc="f:selectItems" value="#{pato.estadosItem}" />
    </select>
</p>	
</h:panelGroup>

<h:panelGroup rendered="#{pessoa.pessoa.estrangeiro}" id="infosEstrangeiro"
    layout="block">
    <p>
    <label jsfc="h:outputLabel" for="anoChegada">Ano Chegada</label>
    <input jsfc="h:inputText" type="text" id="anoChegada" maxlength="4" size="4"
        value="#{pessoa.pessoa.anoChegada}" />
</p>
                    
<p>
    <label jsfc="h:outputLabel" for="naturalidadeEstrangeiro">Naturalidade</label>
    <input jsfc="h:inputText" type="text" id="naturalidadeEstrangeiro" 
        maxlength="80" size="40" value="#{pessoa.pessoa.naturalidadeEstrangeiro}" />
</p>	
</h:panelGroup>

</h:panelGroup>[/code]

No managed bean:

[code]private UISelectOne paisOrigemSelect;

public String paisOrigemOnChange()
{
Pais paisOrigem = (Pais) paisOrigemSelect.getValue();
this.pessoa.setPaisOrigem(paisOrigem);
return null;
}[/code]

Vlw, Obrigado

Olá caros amigos, sou novo com jsf, e estou querendo simplesmente renderizar componentes.

Segue o código, se alguem poder me ajudar!

quero apena mostrar o pessoa fisica e juridica.

[code] <rich:panel>
<h:panelGrid id=“teste” columns=“1”>
<ui:define name=“label”>Tipo Pessoa</ui:define>
<h:selectOneRadio value="#{richFacesBean.formaPagamento}">
<f:selectItem itemValue=“1” itemLabel=“Pessoa Fisica” />
<f:selectItem itemValue=“2” itemLabel=“Pessoa Juridica” />
<a4j:support ajaxSingle=“true” event=“onclick” reRender=“painel1,painel2”/>
</h:selectOneRadio>
</h:panelGrid>

                    &lt;h:panelGrid id="painel1" rendered="#{richFacesBean.formaPagamento eq 1}"&gt;
                        Pessoa Fisica
					&lt;/h:panelGrid&gt;


					&lt;h:panelGrid id="painel2" rendered="#{richFacesBean.formaPagamento eq 2}"&gt;
                        Pessoa Juridica
                    &lt;/h:panelGrid&gt;
        &lt;/rich:panel&gt;[/code]

Bom dia pessoal,

Sou iniciante no JSF e estou desenvolvendo um protótipo onde preciso renderizar dois painéis dentro de uma única janela modal., O primeiro painel contém o form de consulta de CPF e o segundo traz o retorno desta consulta. Adequei o meu código a solução aqui postada sobre ter um “painel pai” e reRenderizá-lo, e ter uma variável booleana no manageBean para tratar a visibilidade dos painéis. A idéia é: quando clicar no botão de consulta o painel de consulta deveria ser omitido e o de retorno de dados exibido. Só que quando clico no botão de consulta do primeiro painel, nada acontece. Pelo console verifico que o método booleano isVisivel() está sendo chamado quando chamo a página. Mas após isso, ao acionar o botão de consulta, observo que nada aparece no console. Alguém pode me ajudar ??? Segue abaixo o código da página e o do manageBean. Lembro que trata-se apenas de protótipo.

Desde já agradeço a ajuda dos feras.

Abçs.
Mônica.

Página consultar_cpf.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	  xmlns:a4j="http://richfaces.org/a4j"    
	xmlns:rich="http://richfaces.org/rich"
	xmlns:serpro="http://www.demoiselle.gov.br">	

	
    <rich:modalPanel id="panelConsultaCPF" styleClass="modalForms modalFormsAbas" width="1000" height="400">
        <f:facet name="header">
            <h:panelGroup>
                <h:outputText value="Consultar CPF"></h:outputText>
            </h:panelGroup>
        </f:facet>
		<f:facet name="controls">
			<a4j:commandButton styleClass="closeModal" onclick="Richfaces.hideModalPanel('panelConsultaCPF')" />
		</f:facet>
 			
  		<!-- PAINEL CONTAINER -->
		<f:view>
		<a4j:form>

  		<a4j:outputPanel id="container"> 		
  		
  			<!-- PAINEL ENTRADA CPF -->
	  			
	  			<a4j:outputPanel id="visivel" rendered="#{cpfMB.visivel}" layout = "block">
						<fieldset class="line">
							<legend class="legend">Informe CPF</legend>
								<div class="line lineForm">
									<div class="unit size1of1 unitGroup noBorder">
										<div class="unit unitData">
											<h:inputText value="#{cpfMB.numero}" styleClass="medium" />
										</div>
									</div>
									<span class="line containerButtons">
										<a4j:commandButton actionListener="#{cpfMB.consultarCPF}" value="Consultar"
                                         styleClass="button" reRender="container"/>
									</span>
								</div>
						</fieldset>
				</a4j:outputPanel>

  			<!-- FIM PAINEL ENTRADA CPF -->

			
  			<!-- PAINEL RETORNO DADOS CPF -->	
	  			<a4j:outputPanel id="invisivel" rendered="#{!cpfMB.visivel}" layout = "block">
					<div class="line containerButtons">						
					    <a4j:commandButton actionListener="#{cpfMB.consultarCPF}" value="Nova Consulta"
                             styleClass="buttonPage" reRender="container"/>								
						<a4j:commandButton styleClass="buttonPage" action="#" value="Fechar [X]"
                             onclick="javascript:self.close()"/>
					</div>
				</a4j:outputPanel>
  			<!-- FIM PAINEL RETORNO DADOS CPF -->
  		
  		</a4j:outputPanel>	

		</a4j:form>
		</f:view>
  		<!-- FIM PAINEL CONTAINER -->
  				
	</rich:modalPanel>

</html>

Código do ManageBean

 import javax.faces.event.ActionEvent;

public class CPFMB {
	
        ...
	private boolean visivel = true;

	public void consultarCPF(ActionEvent e){

		this.setVisivel(false);
	}
	
        ...

	public void setVisivel(boolean visivel) {
		
		System.out.println("setVisivel");
		this.visivel = visivel;
	}

	public boolean isVisivel() {
		System.out.println("isVisivel");
		return visivel;
	}
}