[Resolvido]Campo não pega o valor atualizado com o <p:ajax>

Pessoal tenho a seguinte situação:

Tenho a data final e data inicial, só que a data final é formada pela soma do prazo com a data inicial e se você notar que dentro do selectOneMenu tem um <p:ajax> que faz um update no componente datafinal, mas o resultado não mostra, porém ao apertar em algum botão no terminal mostra o valor da datafinal mas não aparece o valor apra o usuário.

   <h:form id="form">
<p:panelGrid id="pnlcomplementares" columns="2">
                    <p:outputLabel for="datainicial" value="Data inicial: "/>
                    <p:calendar id="datainicial" value="#{processoFaces.selectProcesso.datainicial}" pattern="dd/MM/yyyy" size="18"/>
                    <p:outputLabel for="prazo" value="Prazo: "/>
                    <p:selectOneMenu id="prazo" value="#{processoFaces.selectProcesso.prazo}">
                        <f:selectItem itemLabel="- Selecione o Prazo - " />
                        <f:selectItem itemLabel="5 Dias" itemValue="5" />
                        <f:selectItem itemLabel="10 Dias" itemValue="10" />
                        <f:selectItem itemLabel="15 Dias" itemValue="15" />
                        <f:selectItem itemLabel="20 Dias" itemValue="20" />
                        <f:selectItem itemLabel="30 Dias" itemValue="30" />
                        <f:selectItem itemLabel="45 Dias" itemValue="45" />
                        <f:selectItem itemLabel="60 Dias" itemValue="60" />
                        <f:selectItem itemLabel="90 Dias" itemValue="90" />
                        <f:selectItem itemLabel="120 Dias" itemValue="120" />
                        <f:selectItem itemLabel="180 Dias" itemValue="180" />
                        <f:selectItem itemLabel="240 Dias" itemValue="240" />
                        <f:selectItem itemLabel="365 Dias" itemValue="365" />
                        <p:ajax event="blur" listener="#{processoFaces.onChange}" update=":form:datafinal, :form:pnlcomplementares, :form:msg" />
                    </p:selectOneMenu>
                    <p:outputLabel for="datafinal" value="Data Final: "/>
                    <p:calendar  id="datafinal" value="#{processoFaces.selectProcesso.datafinal}" pattern="dd/MM/yyyy" />
                     

                    <p:outputLabel for="descricao" value="Descricão do Processo: "/>
                    <p:inputTextarea id="descricao" value="#{processoFaces.selectProcesso.descricao_processo}" style=" width: 780px; height: 299px"/>
                </p:panelGrid>
<h:form/>

Método onChange

public void onChange(SelectEvent event){
        System.out.println("Selecionando o evento");
        System.out.println("==="+event.getObject().toString()+"===");
        Calendar cal = Calendar.getInstance();
        cal.setTime(selectProcesso.getDatainicial());
        cal.add(Calendar.DATE, selectProcesso.getPrazo());
        selectProcesso.setDatafinal(cal.getTime());   
        msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Data Final é igual"+ event.getObject().toString(), null);
        FacesContext.getCurrentInstance().addMessage("add", msg);
    }

O método de acesso(SET)

 public void setPrazo(Integer prazo) {
        System.out.println("Set Prazo");
        this.prazo = prazo;
        Calendar cal = Calendar.getInstance();
        cal.setTime(datainicial);
        cal.add(Calendar.DATE, prazo);
        datafinal = cal.getTime();
        setDatafinal(datafinal);
        System.out.println("Data Final: "+getDatafinal());
    }
//este é o caso da soma da data de hoje mais 10 dias
Set Prazo
Data Final: Sun Dec 02 00:00:00 BRST 2012

Desde já agradeço pela ajuda.

por que você deixou no evento blur e não change ?

por que testei com change, select, mas como no site do primefaces tem o blur então coloquei o blur, pois não sei todos os eventos que existem neste componentes.

tente assim

<p:selectOneMenu id="prazo" value="#{processoFaces.selectProcesso.prazo} onchange="#{processoFaces.onChange}" update=":form:datafinal, :form:pnlcomplementares, :form:msg"> <f:selectItem itemLabel="- Selecione o Prazo - " /> <f:selectItem itemLabel="5 Dias" itemValue="5" /> <f:selectItem itemLabel="10 Dias" itemValue="10" /> <f:selectItem itemLabel="15 Dias" itemValue="15" /> <f:selectItem itemLabel="20 Dias" itemValue="20" /> <f:selectItem itemLabel="30 Dias" itemValue="30" /> <f:selectItem itemLabel="45 Dias" itemValue="45" /> <f:selectItem itemLabel="60 Dias" itemValue="60" /> <f:selectItem itemLabel="90 Dias" itemValue="90" /> <f:selectItem itemLabel="120 Dias" itemValue="120" /> <f:selectItem itemLabel="180 Dias" itemValue="180" /> <f:selectItem itemLabel="240 Dias" itemValue="240" /> <f:selectItem itemLabel="365 Dias" itemValue="365" /> </p:selectOneMenu>

o seu método onChange é executado quando você altera o select?

Cara a tag update não tem no SelectOneMenu e com o onchange deu o erro:


Caused by: javax.el.ELException: /Cadastro/processo.xhtml @61,134 onchange="#{processoFaces.onChange()}": Unable to find method [onChange] with [0] parameters

é que eu fix com “checkBox”, achei que ia ser a mesma coisa :confused:

O problema dele não foi o onchange, ele tem que tirar os parâmetros da EL.

Pessoal, fiz o teste de salvar no banco e o valor foi certo, porém não aparece na tela da aplicação.

O attributo onchange é pra executar javascript… não faça isso!

[quote=Valeio Bezerra]tente assim

<p:selectOneMenu id="prazo" value="#{processoFaces.selectProcesso.prazo} onchange="#{processoFaces.onChange}" update=":form:datafinal, :form:pnlcomplementares, :form:msg"> <f:selectItem itemLabel="- Selecione o Prazo - " /> <f:selectItem itemLabel="5 Dias" itemValue="5" /> <f:selectItem itemLabel="10 Dias" itemValue="10" /> <f:selectItem itemLabel="15 Dias" itemValue="15" /> <f:selectItem itemLabel="20 Dias" itemValue="20" /> <f:selectItem itemLabel="30 Dias" itemValue="30" /> <f:selectItem itemLabel="45 Dias" itemValue="45" /> <f:selectItem itemLabel="60 Dias" itemValue="60" /> <f:selectItem itemLabel="90 Dias" itemValue="90" /> <f:selectItem itemLabel="120 Dias" itemValue="120" /> <f:selectItem itemLabel="180 Dias" itemValue="180" /> <f:selectItem itemLabel="240 Dias" itemValue="240" /> <f:selectItem itemLabel="365 Dias" itemValue="365" /> </p:selectOneMenu> [/quote]

Onde você seta a dataFinal? Você deve fazer isso no método onChange e não no set.

Tenta isso:

<p:selectOneMenu id="prazo" value="#{processoFaces.selectProcesso.prazo}">   
      <f:selectItem itemLabel="365 Dias" itemValue="365" />  
      <p:ajax event="change" listener="#{processoFaces.onChange}" process="@this" update=":form:datafinal, :form:pnlcomplementares, :form:msg" />  
</p:selectOneMenu>

Galera pegou em aprtes, ainda não foi resolvido, por que a primiera vez que eu coloco a data e depois o prazo o componente não redendereiza, ams quando eu aperto no botão voltar e aponta para própria página e mudo o prazo, o componente mostra, mas se o usuário tiver que fazer isso toda vez é inviável.

O listener não funcionou, pois dá um erro método onChenage not found mais está tudo certo, não entendi.


javax.el.MethodNotFoundException: Method not found: br.com.sisjus.faces.ProcessoFaces@13e20ad.onChange(javax.faces.event.AjaxBehaviorEvent)

mais o cógiso que pegou foi esse:

<p:ajax event="change"  process="@this" update=":form:datafinal, :form:pnlcomplementares, :form:msg"/>
...

//o botão voltar
<p:commandButton id="voltar" value="Voltar" action="#"/>

Mas o problema é que de primeira não redenderiza.

Ah aliais eu mudei o escopo para @ViewScoped.

Alguem

tenta assim:

<p:ajax event="change"  process="@this" update="datafinal"/> 

Fiz este teste, mas continuo do mesmo jeito, precisa aperta em algum botão para dai mudar o combo do prazo e aparececer a data final.

Você poderia postar o código do BackingBean inteiro?

[quote=MiguelCP]Galera pegou em aprtes, ainda não foi resolvido, por que a primiera vez que eu coloco a data e depois o prazo o componente não redendereiza, ams quando eu aperto no botão voltar e aponta para própria página e mudo o prazo, o componente mostra, mas se o usuário tiver que fazer isso toda vez é inviável.

O listener não funcionou, pois dá um erro método onChenage not found mais está tudo certo, não entendi.


javax.el.MethodNotFoundException: Method not found: br.com.sisjus.faces.ProcessoFaces@13e20ad.onChange(javax.faces.event.AjaxBehaviorEvent)

mais o cógiso que pegou foi esse:

<p:ajax event="change"  process="@this" update=":form:datafinal, :form:pnlcomplementares, :form:msg"/>
...

//o botão voltar
<p:commandButton id="voltar" value="Voltar" action="#"/>

Mas o problema é que de primeira não redenderiza.

Ah aliais eu mudei o escopo para @ViewScoped.

Alguem[/quote]

Estou tentando de outra maniera pois pude perceber no site do primefaces que não é necessario o listener ter um event, então segue o código:


@ManagedBean(name="processoFaces")
@ViewScoped
public class ProcessoFaces implements Serializable{
    
     FacesMessage msg;
     private static final Logger LOG = Logger.getLogger(ProcessoFaces.class.getName());
     private Processo selectProcesso = new Processo();
     private ProcessoDAO processDAO = new ProcessoDAO();
     private List<Processo> ListOfProcess;
     private int idProcura;
     
    /**
     * Creates a new instance of ProcessoFaces
     */
    public ProcessoFaces() {
    }
    
    public void CleanProcess(){
        selectProcesso = null;
    }
    
     public List<Processo> getListOfProcess() {
        if (ListOfProcess == null) {
            ListOfProcess = processDAO.Search();
        }
        return ListOfProcess;
    }
     public List<SelectItem> getListOfItemProcessos(){
        List<Processo> ListOfItemOfProcess = null;
         List<SelectItem> toDataReturn = new LinkedList<SelectItem>();
         ProcessoDAO processosDAO = new ProcessoDAO();
         
         try{
              ListOfItemOfProcess  = processosDAO.findAll(Processo.class);
              for(Processo pro: ListOfItemOfProcess){
                  toDataReturn.add(new SelectItem(pro.getNumero_processo(),pro.toString()));
              }
          }catch (Exception e){
            e.printStackTrace();
        }
         
         return toDataReturn;
     }
public void onChange(){
        System.out.println("Selecionando o evento");
        if (selectProcesso.getDatainicial() != null){
            System.out.println("Entrou no IF!");
        Calendar cal = Calendar.getInstance();
        cal.setTime(selectProcesso.getDatainicial());
        cal.add(Calendar.DATE, selectProcesso.getPrazo());
        selectProcesso.setDatafinal(cal.getTime());  
        }else 
            System.out.println("Data inicial Nulo!");
       /* msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Data Final é igual"+ event.toString(), null);
        FacesContext.getCurrentInstance().addMessage("add", msg);*/
    }
      //Getter´s and setter´s
  }

Na pagina web:


 <p:fieldset legend="Dados Complementares">
                <p:panelGrid id="pnlcomplementares" columns="2">
                    <p:outputLabel for="datainicial" value="Data inicial: "/>
                    <p:calendar id="datainicial" value="#{processoFaces.selectProcesso.datainicial}" pattern="dd/MM/yyyy" size="18" />
                    <p:outputLabel for="prazo" value="Prazo: "/>
                    <p:selectOneMenu id="prazo" value="#{processoFaces.selectProcesso.prazo}">
                        
                        <f:selectItem itemLabel="- Selecione o Prazo - " itemValue=" "/>
                        <f:selectItem itemLabel="5 Dias" itemValue="5" />
                        <f:selectItem itemLabel="10 Dias" itemValue="10" />
                        <f:selectItem itemLabel="15 Dias" itemValue="15" />
                        <f:selectItem itemLabel="20 Dias" itemValue="20" />
                        <f:selectItem itemLabel="30 Dias" itemValue="30" />
                        <f:selectItem itemLabel="45 Dias" itemValue="45" />
                        <f:selectItem itemLabel="60 Dias" itemValue="60" />
                        <f:selectItem itemLabel="90 Dias" itemValue="90" />
                        <f:selectItem itemLabel="120 Dias" itemValue="120" />
                        <f:selectItem itemLabel="180 Dias" itemValue="180" />
                        <f:selectItem itemLabel="240 Dias" itemValue="240" />
                        <f:selectItem itemLabel="365 Dias" itemValue="365" />
                        <p:ajax event="change" process="@this" listener="#{processoFaces.onChange}" update=":form:datafinal"/>
                    </p:selectOneMenu>
                    <p:outputLabel for="datafinal" value="Data Final: "/>
                    <p:calendar  id="datafinal" value="#{processoFaces.selectProcesso.datafinal}" pattern="dd/MM/yyyy" />

Sinceramente…

Não vejo porque estar sendo lançada a exceção de MethodNotFoundException. Acho melhor você colocar um ponto de parada dentro do onChange, debugar e verificar se esta entrando neste método. Caso esteja confira se os valores correspondem, principalmente do selectProcesso.getPrazo().

Pessoal, conseguir resolver, é o seguinte fui tentar não colocar o evento nem o listener apra ficar desssa forma

  <p:ajax update=":form:pnlcomplementares"/>

COm isso ainda não pegava, porém coloquei no método get e set da data inicial para vê o valor que estava pegando, foi ai que descobrir, o valor estava sempre nulo, apneas quando eu apertava em algum botão que a data era setada, pois bem com isso coloquei a linha abaixo no entre as tag calendar <p:calendar></p:calendar>


 <p:ajax process="@this" event="dateSelect" update=":form:pnlcomplementares"/>

Com isso Funiconou, obrigado a todos pela ajuda.