estou construindo uma pagina com icefaces em que tem dois componentes ice:selectOneListbox… um deles precisa de partialsubmit para popular campos de outputtext e o outro nao precisa de partialsubmit porque seu valor somente será buscado depois de clicar em salvar…
seguem os exemplos:
tela.jspx
<td class="style15" align="left">
<ice:outputText value="#{msg['projeto.label.empresa']}" />
</td>
<td class="style15" align="left">
<ice:selectOneMenu id="SelectEmpresa" styleClass="select" style="overflow: auto;width: 160px;" value="#{projetoBean.selectedEmpresa}">
<f:selectItems value="#{projetoBean.empresasAll}" />
</ice:selectOneMenu>
</td>
<td class="style15" align="left">
<ice:outputText value="#{msg['projeto.label.estacao']}" />
</td>
<td class="style15" align="left">
<ice:selectOneListbox id="SelectEstacao" size="5" styleClass="select" style="overflow: auto;width: 160px;" rendered="true" immediate="true" value="#{projetoBean.selectedEstacao}" partialSubmit="true" valueChangeListener="#{projetoBean.alteraEstacaoSelecionada}"
<f:selectItems id="slLocalidade" value="#{projetoBean.estacoesAll}" />
</ice:selectOneListbox>
</td>
bean
private EmpresaFacade empresaFacade;
private EstacaoFacade estacaoFacade;
private SelectItem[] empresasAll;
private SelectItem[] estacoesAll;
private Integer selectedEmpresa;
private Long selectedEstacao;
public SelectItem[] getEmpresasAll() {
try {
SelectItem elem;
if (empresasAll == null) {
List empresasList = empresaFacade.getEmpresasAtivas();
if (empresasList.size() > 0) {
int i = 0;
empresasAll = new SelectItem[empresasList.size()];
Iterator iterator = empresasList.iterator();
while (iterator.hasNext()) {
Empresa empresa = (Empresa) iterator.next();
elem = new SelectItem(empresa.getCodigo(), empresa
.getNome());
empresasAll[i] = elem;
i++;
}
}
}
} catch (Exception e) {
FacesMessage f = new FacesMessage(
"Erro ao listar todos as empresas " + e.getMessage());
FacesContext.getCurrentInstance().addMessage("", f);
e.printStackTrace();
return null;
}
return empresasAll;
}
/* A logica do codigo para getEstacoesAll() é igual ao de getEmpresasAll() */
public void alteraEstacaoSelecionada(ValueChangeEvent event){
this.selectedEstacao = (Long) event.getNewValue();
this.populaEstacao();
}
private void populaEstacao() {
if (selectedEstacao != null) {
this.setEstacaoSge(this.estacaoFacade.getEstacao(this.selectedEstacao));
}
}
No codigo acima, quando altera alguma empresa no selectonelistbox, nada acontece com a tela, o que está correto… porém quando altera alguma estação, toda a tela é carregada novamente, inclusive as empresas…
alguem pode me ajudar? outra pergunta… sempre quando carrega a tela ou quando eu seleciono alguma opcao em estacao, os codigos de getEmpresasAll() e getEstacoesAll() são executados 2 vezes cada um… por que?