[RESOLVIDO] Ajuda com <h:selectBooleanCheckBox>

Boa tarde caros amigos, desculpem desenterrar este assunto, mas já fiz vários testes com tópicos q achei no Forum e não funcionou no meu caso,
eu preciso qdo eu clicar no checkBox seja renderizado um compononente novo e o que estava em tela eh omitido, mas não está funcionando do jeito que preciso,
segue abaixo o trecho do sistema:

<h:panelGrid columns="1">
				<h:panelGrid id="vAtivo" rendered="#{finalizacao.valor eq 'false'}">
					<h:outputLabel value="Veiculo" />
					<t:column>
						<h:inputText binding="#{ finalizacao.idVeiculo }" id="idVeiculo"
							size="6"
							onfocus="document.getElementById( 'form:veiculo' ).focus();"
							styleClass="transparente">
						</h:inputText>
						<f:verbatim>&nbsp;</f:verbatim>
						<s:tableSuggestAjax id="veiculo"
							suggestedItemsMethod="#{ finalizacao.listVeiculo }"
							maxlength="50" var="list" size="55" betweenKeyUp="300"
							startRequest="2" charset="utf-8"
							binding="#{ finalizacao.veiculo }">
							<t:column>
								<f:facet name="header">
									<s:outputText style="font-size:8;" value="Id" />
								</f:facet>
								<s:outputText for="idVeiculo" style="font-size:8px;"
									label="#{list.id}" />
							</t:column>
							<t:column>
								<f:facet name="header">
									<s:outputText style="font-size:8;" value="Nome" />
								</f:facet>
								<s:outputText for="veiculo" style="font-size:8px;"
									label="#{list.nome}" />
							</t:column>
						</s:tableSuggestAjax>
					</t:column>
				</h:panelGrid>
				<h:panelGrid id="vInativo" rendered="#{finalizacao.valor == 'true'}">
					<h:outputLabel value="Veículo" />
					<t:column>
						<h:inputText binding="#{ finalizacao.idVeiculoInativo }"
							id="idVeiculoInativo" size="6"
							onfocus="document.getElementById( 'form:veiculo' ).focus();"
							styleClass="transparente">
						</h:inputText>
						<f:verbatim>&nbsp;</f:verbatim>
						<s:tableSuggestAjax id="veiculoInativo"
							suggestedItemsMethod="#{ finalizacao.listVeiculoInativos}"
							maxlength="50" var="list" size="55" betweenKeyUp="300"
							startRequest="2" charset="utf-8"
							binding="#{ finalizacao.veiculoInativo }">
							<t:column>
								<f:facet name="header">
									<s:outputText style="font-size:8;" value="Id" />
								</f:facet>
								<s:outputText for="idVeiculoInativo" style="font-size:8px;"
									label="#{list.id}" />
							</t:column>
							<t:column>
								<f:facet name="header">
									<s:outputText style="font-size:8;" value="Nome" />
								</f:facet>
								<s:outputText for="veiculoInativo" style="font-size:8px;"
									label="#{list.nome}" />
							</t:column>
						</s:tableSuggestAjax>
					</t:column>
				</h:panelGrid>
				
				<h:panelGrid columns="3">
					<t:selectBooleanCheckbox id="cbCarregaInativos"
						value="#{finalizacao.valor}">
						<a4j:support reRender="vInativo"
							action="#{finalizacao.mudaValor}" event="onclick" immediate="true" ajaxSingle="true"/>
					</t:selectBooleanCheckbox>
					<h:outputLabel value="Carregar Inativos" />
					<h:commandButton value="Cadastrar" disabled="#{finalizacao.valor == 'false'}"
						action="#{finalizacao.goCadastro}" />
				</h:panelGrid>
			<h:panelGrid columns="2">
			<t:selectBooleanCheckbox id="respSolAt" value="#{finalizacao.solicitacao}" rendered="#{finalizacao.valor == 'true'}">
			<a4j:support action="#{finalizacao.perguntar}" event="onclick" immediate="true"/>
			</t:selectBooleanCheckbox>
			<h:outputLabel value="Enviar Rota e Solicitar Ativação?" rendered="#{finalizacao.valor == 'true'}"/>
			</h:panelGrid>

no meu Bean está assim:

private Boolean valor;

public Boolean getValor() {
		return valor;
}
public void setValor(Boolean valor) {
		this.valor = valor;
}

public String mudaValor() {
		String retorno = "";
		if (valor != null) {
			if (valor == true) {
				valor = false;
			} else {
				valor = true;
			}
		} else {
			retorno = "finalizacao";
		}
		return retorno;
	}

Este método mudaValor derepente nem precisava ser feito, mas eu fiz para poder ver o q estava acontecendo com a variável valor.
Isso funciona quando o escopo do Bean está como session, mas no meu caso, eu tenho mais algumas telas para finalizar a solicitação e quando eu faço uma nova, está carregando todos os campos… Eu preciso usar o escopo request.
Só que como request, o check eh selecionado e a página recarrega e ele eh desmarcado e não mostra o outro panelGrid.
Outro Detalhe que debugando eu vi, que a variável valor a tela finalizacao é executada sempre vem com valor false.

Não sei mais o que fazer, alguém pude ajudar aí.
Desde já agradeço.

Att.
Diego Silva

Bom dia, ngm pode ajudar aí?

Olá Diego,

O seu problema parece estar relacionado com rendered dinâmico no componentes.

Escrevi um post há algum tempo atrás no meu blog, acredito que ele poderá te ajudar, http://www.rponte.com.br/2010/12/01/problema-do-rendered-dinamico-com-jsf/

Então meu jovem, eu fiz igual ao teu tópico, mas não funcionou do jeito que preciso o meu problema acredito que esteja na questão do scopo do Managed-bean que para funcionar precisa estar como session, aí carrega todos os campos novamente qdo eu entro para fazer uma nova solicitação. Já tentei de várias maneiras limpar a session, mas ainda vem os dados.

E de que jeito você precisa?

E de que jeito você precisa?[/quote]

Se uso no modo session, a rendereização funciona, preciso usar no modo request, mas aí não rederiza, e qdo isso acontece, depois não some da tela.

Você precisa de um escopo maior do que request para seu objeto #{finalizacao} ou no mínimo para #{finalizacao.valor}, pois eles são avaliados a cada request pelo jsf. Nesse caso aconselho o escopo @ViewScoped ou o componente t:saveState do Tomahawk.

Você precisa de um escopo maior do que request para seu objeto #{finalizacao} ou no mínimo para #{finalizacao.valor}, pois eles são avaliados a cada request pelo jsf. Nesse caso aconselho o escopo @ViewScoped ou o componente t:saveState do Tomahawk.[/quote]

Opa, bom também! Poderia postar algum exemplo aí ? Desde já agradeço.

Pelo que pude perceber no seu código você já utiliza o Tomahawk. Sendo, segue o managed bean em escopo de request e a página que utiliza o t:saveState.

No final das contas, usar a anotação @ViewScoped do JSF2 ou o componente t:saveState funcionam da mesma forma: o objeto é armazenado no escopo view do jsf, isto é, um escopo maior do que request e menor do que session.

Pelo que pude perceber no seu código você já utiliza o Tomahawk. Sendo, segue o managed bean em escopo de request e a página que utiliza o t:saveState.

No final das contas, usar a anotação @ViewScoped do JSF2 ou o componente t:saveState funcionam da mesma forma: o objeto é armazenado no escopo view do jsf, isto é, um escopo maior do que request e menor do que session.[/quote]

Entendo, Só q tem um problema o sistema da empresa q assumi aqui eh todo em JSF 1.2, como a demanda é grande de alterações, ainda não sobrou tempo de atualizar para 2.0, apanho muito aqui pois aprendi JSF2.0, PrimeFaces… Basicamente o que preciso é isso: qdo abre a tela, tem q renderizar o um componente, qdo eu clico no checkbox, este que renderizou precisa sumir e renderizar o segundo componente, e vice-versa.

Entendo.

Aqui você tem uma aplicação com JSF1.2 na qual se utiliza do componente t:saveState. No final das contas a utilização do componente é idêntica no JSF1.2 e 2.0.

Valeu meu jovem, vou ver como funciona e tentar implementar aqui… Desde já muito obrigado pela paciência.

Cordialmente
Diego Silva

Olá Rafael, só mais uma dúvida, aí tenho q usar o rendered dinâmico? E o Escopo uso request?

Ter o managed bean como escopo de request e colocar apenas propriedades desse managed bean no escopo view (isto é, com t:saveState) é suficiente para resolver teu problema. O rendered dinâmico você vai precisar, pois se faz necessário exibir ou não determinados componentes.

É necessário que você leia e entenda o problema em utilizar rendered dinâmico (ou seja, rendered que tem EL) com ajax.

Bom dia galera, quero agradecer a ajuda do Rafael Ponte, pois sem suas respostas ao meu tópico e a um post do seu Blog - http://www.rponte.com.br, não teria entendido e solucionado o meu problema com “rendered dinâmico”.

Segue o link do post: http://www.rponte.com.br/2010/12/01/problema-do-rendered-dinamico-com-jsf/, com certeza vale a pena ler!

Cordialmente agradeço novamente
Diego Silva :-o