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 
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.