valueChangeListener do JSF

Tenho uma tela de saldo aonde o cliente selciona o banco e eu mostro o saldo do mesmo, so que ele so mostra do primeiro banco selecionado, caso contrario o valor nao muda mais apesar do objeto conta esta sendo setado e o atributo saldo esta sendo modificado.

o select esta assim

<h:selectOneMenu id="conta" value="#{SaldoBean.conta.codigo}" valueChangeListener="#{SaldoBean.baixaSaldo}" onchange="submit()" immediate="true">
  <f:selectItem itemLabel="#{properties['lb_selecione']}" itemValue=""/>
  <f:selectItems id="sel_contas" value="#{SaldoBean.contas}"/>
</h:selectOneMenu>

o campo text do saldo esta assim

<t:inputText id="valor" value="#{SaldoBean.conta.saldo}" size="12" immediate="true" readonly="true" converter="DoubleConverter" forceId="true"/>

o codigo baixaSaldo esta aqui

public void baixaSaldo(ValueChangeEvent event) {
  FacesContext facesContext = FacesContext.getCurrentInstance();
  try{
    log.debug("(Integer)event.getNewValue() " + (Integer)event.getNewValue());
    if ((Integer)event.getNewValue() != null)
      conta = delegate.obterSaldoConta(new ContaVO((Integer)event.getNewValue()));
    else conta.setSaldo(new Double(20));
    log.debug("Conta " + conta.getSaldo());
  }catch(Exception e){
    log.error("Erro no momento de baixar Saldo", e);
  }
  facesContext.renderResponse();
}

alguem tem alguma luz do que estou fazendo errado??

opa eae blz?
cara acho que se vc fizer isso aqui vai resolver o problema

UISelectOne select = (UISelectOne) event.getSource();
        String valor = String.valueOf(select.getValue());

vai resolver o problema…porque na verdade vc está sempre pegando o primeiro valor!!! bom acho que é isso!!!.. falow

Me expressei mau, ele so mostar o primeiro saldo do banco selecionado, na verdade o que não é atualizado é o campo text.

uma coisa que me passou é pegar o campo pelo facesContext e mudar o valor direto nele.
mais como consigo pegar esse component.

valeu pela ajuda

bom pelo binding…
vc cria um componente do tipo input e passa para ele o valor que vc quer…
mas acho que se vc tirar essa paradas ae de Faces…etc…

e der apenas um set/get no valor ele atualiza!!!

se optar por criar o binding… é só ir lá no campo
que vc quer preencher e colocar binding={#meubena.meuInput}…
e no metodo do valueChangeListener vc preenche ele …acredito que irar funcionar!!! se de certo posta ae como é que ficou!!!

Resolvi o problema com ValueChangeListener usando o ciclo de vida do bean.
com esse codigo eu faço com que o listener seja executado no ciclo de vida do bean em que ele vai executar os gets, pois o get era eecutado antes do listener

if (pEvent.getPhaseId().equals(PhaseId.ANY_PHASE)){ pEvent..setPhaseId(PhaseId.UPDATE_MODEL_VALUES); pEvent.queue(); } if ( pEvent.getPhaseId().equals(PhaseId.UPDATE_MODEL_VALUES)){ //codigo de desejado }

massa… tinha esqueci que vc pode manipular os ciclos de vida…muito fera…mesmooooo

[quote=afamorim]Resolvi o problema com ValueChangeListener usando o ciclo de vida do bean.
com esse codigo eu faço com que o listener seja executado no ciclo de vida do bean em que ele vai executar os gets, pois o get era eecutado antes do listener

if (pEvent.getPhaseId().equals(PhaseId.ANY_PHASE)){ pEvent..setPhaseId(PhaseId.UPDATE_MODEL_VALUES); pEvent.queue(); } if ( pEvent.getPhaseId().equals(PhaseId.UPDATE_MODEL_VALUES)){ //codigo de desejado } [/quote]
Isso parece swing.

Nem me fale, eu que so desenvolvi para web, trabalho desktop so na faculdade mesmo.

Aqui eu explico um "macete" interessante sobre o valuechangelistener >>

Abraço!

.

Engraçado imaginar que você precisa fazer uma gambiarra para a ferramenta valueChangeListener funcionar como ela já deveria funcionar naturalmente, ou seja, fazendo o menaged bean já ter recebido o valor que foi alterado pelo usuário antes de tratá-lo.
Importante lembrar que o objeto ValueChangeEvent tem dois métodos getNewValue() e getOldValue(). Com esses dois métodos, você pode inclusive tratar casos onde é importante saber qual opção estava selecionada ANTES de o usuário modificar o select.

Muito bom o post.

[quote=afamorim]Resolvi o problema com ValueChangeListener usando o ciclo de vida do bean.
com esse codigo eu faço com que o listener seja executado no ciclo de vida do bean em que ele vai executar os gets, pois o get era eecutado antes do listener

if (pEvent.getPhaseId().equals(PhaseId.ANY_PHASE)){ pEvent..setPhaseId(PhaseId.UPDATE_MODEL_VALUES); pEvent.queue(); } if ( pEvent.getPhaseId().equals(PhaseId.UPDATE_MODEL_VALUES)){ //codigo de desejado } [/quote]

Não dei certo comigo. Segue como eu fiz :<h:selectBooleanCheckbox id="sabM1" valueChangeListener="#{beanEscalaProfessor.testando}" onchange="submit()" value="#{beanEscalaProfessor.validadia[5][0]}"> <f:ajax render="sexN2"/> </h:selectBooleanCheckbox>

No meu bean

public void testando(ValueChangeEvent event) {
            for (Integer i = 0; i < 6; i++) {
                for (Integer j = 0; j < 7; j++) {
                    if (validadia[i][j] == null || validadia[i][j] != true) {
                        diaescala(i + j.toString());
                    }
                }
            }
         if (event.getPhaseId().equals(PhaseId.ANY_PHASE)) {
            event.setPhaseId(PhaseId.UPDATE_MODEL_VALUES);
            event.queue();
        }

Eu quero pegar o valor da variável validadia que é um vetor de boolean.

esse link é muito bom http://java-server-faces.blogspot.com/2006/04/valuechangelisteners-what-you-need-to.html sobre o assunto