JSF + PrimeFaces - CommandButton não funciona

Boa tarde pessoal,

Estou continuando meus estudos em JSF + PrimeFaces… e estou com o seguinte problema:

Tenho um CRUD (que estou fazendo pra aprender mesmo) de UF… tudo já está funcionando, porém está acontecendo um comportamento bem estranho e eu ainda não consegui identificar/entender o problema.

Tenho um botão “NOVO”, um “ALTERAR”, um “EXCLUIR” e em seguida, um campo de pesquisa, que atualiza a grid.

Se eu rodar o sistema e clicar em novo, nada acontece (comportamento da função é instanciar um novo objeto e mudar a guia do tabview). Se eu consultar alguma coisa, ou seja, se eu digitar alguma coisa no campo de pesquisa, atualizando assim a grid, o botão “NOVO” passa a funcionar…

Detalhe, isso não acontece só no botão novo, mas em todos os botões do container…

Alguém poderia me dar uma dica?

P.S.: Desconfio que tem ligação com a composição dos forms e/ou os updates, mas não consegui solução…

Segue o código:

XHTML:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:p="http://primefaces.org/ui">
<h:head>
</h:head>
<h:body>

	<p:growl id="msg" showDetail="true"/>

	<p:tabView id="tabGeral" activeIndex="#{CadUf.tabSelecionada}">

		<p:tab id="tabConsulta"  title="Consulta" disabled="#{CadUf.tabConsulta}">

			<h:form id="formConsulta">				
				
				<p:dataTable id="tableConsulta" var="u" value="#{CadUf.ufs}"  
                 			 paginator="true" rows="10"  
                 			 paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"  
                 			 rowsPerPageTemplate="5,10,15,20,25" selection="#{CadUf.uf}" selectionMode="single" rowKey="#{u.nome}">
                 				
					<p:column style="width:20%">
						<f:facet name="header">
						Cód. Uf:
						</f:facet>
						<h:outputLabel value="#{u.cod_uf}" />
					</p:column>
					
					<p:column>
						<f:facet name="header">
						Nome da Uf:
						</f:facet>
						<h:outputLabel value="#{u.nome}" />
					</p:column>
					
					<p:column style="width:20%">
						<f:facet name="header">
						Sigla:
						</f:facet>
						<h:outputLabel value="#{u.sigla}" />
					</p:column>			   				   

				</p:dataTable>							
				
				<br></br>
								
				<h:panelGrid columns="5">

					<p:commandButton value="Novo" icon="ui-icon-lightbulb"
						actionListener="#{CadUf.novo}" update=":tabGeral, :tabGeral:tabConsulta, :tabGeral:tabCadastro"/>
						
					<p:commandButton value="Alterar" icon="ui-icon-pencil"
						actionListener="#{CadUf.alterar}" update=":tabGeral, :tabGeral:tabConsulta, :tabGeral:tabCadastro"/>
						
					<p:commandButton value="Excluir" onclick="return confirm('Tem certeza de que deseja excluir este registro?')" icon="ui-icon-trash"
						actionListener="#{CadUf.excluir}" update="formConsulta"/>	
							
					<h:outputLabel value="Pesquisar:"/>
					<p:inputText value="#{CadUf.textPesquisa}">
						<p:ajax event="keyup" listener="#{CadUf.pesquisar}" update="tableConsulta"/> 
					</p:inputText>

				</h:panelGrid>

			</h:form>

		</p:tab>

		<p:tab title="Cadastro" id="tabCadastro" disabled="#{CadUf.tabCadastro}">

			<h:form id="formCadastro">

			<h:panelGrid columns="2">
			
			Código: <h:inputText value="#{CadUf.uf.cod_uf}" size="50" id="codigo" />
			Nome: <h:inputText value="#{CadUf.uf.nome}" size="50" id="nome" />
			Sigla: <h:inputText value="#{CadUf.uf.sigla}" size="50" id="sigla" />
			
			</h:panelGrid>

			<h:panelGrid columns="3">
					<p:commandButton value="Salvar" icon="ui-icon-disk" actionListener="#{CadUf.salvar}" update=":msg, :tabGeral, :tabGeral:tabConsulta, :tabGeral:tabCadastro"/>					
					<p:commandButton value="Limpar" icon="ui-icon-document" actionListener="#{CadUf.limpar}" update="formCadastro"/>					
					<p:commandButton value="Cancelar" icon="ui-icon-radio-off" actionListener="#{CadUf.cancelar}" update=":tabGeral, :tabGeral:tabConsulta, :tabGeral:tabCadastro"/>
				</h:panelGrid>
			
			</h:form>
		</p:tab>

	</p:tabView>

</h:body>
</html>

Beans:

package script;

import java.io.Serializable;

import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
 
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ViewScoped;

import model.Uf;
import dao.UfDao;

@ManagedBean(name="CadUf")
@ViewScoped
public class CadUf implements Serializable{

	private static final long serialVersionUID = 1L;
	
	private Uf uf;
	
	UfDao ufdao = new UfDao();
	
	private List<Uf> ufs;
	
	private Integer tabSelecionada = 0;
	
	private String textPesquisa;
	
	private Boolean tabConsulta;
	
	private Boolean tabCadastro = true;
	
	private String action;
	
	public String getAction() {
		return action;
	}

	public void setAction(String action) {
		this.action = action;
	}
	
	public Boolean getTabConsulta() {
		return tabConsulta;
	}

	public void setTabConsulta(Boolean tabConsulta) {
		this.tabConsulta = tabConsulta;
	}

	public Boolean getTabCadastro() {
		return tabCadastro;
	}

	public void setTabCadastro(Boolean tabCadastro) {
		this.tabCadastro = tabCadastro;
	}
	
	public String getTextPesquisa() {
		return textPesquisa;
	}

	public void setTextPesquisa(String textPesquisa) {
		this.textPesquisa = textPesquisa;
	}

	public CadUf() {
		atualiza();
	}
	
	public void atualiza() {
	
		ufs = ufdao.getAll();
	
	}
	
	public Uf getUf() {
		return uf;
	}

	public List<Uf> getUfs() {
		return ufs;
	}

	public void setUfs(List<Uf> ufs) {
		this.ufs = ufs;
	}

	public void setUf(Uf uf) {
		this.uf = uf;
	}

	public void novo() {
		
		uf = new Uf();
		
		tabCadastro = false;
		tabConsulta = true;
		tabSelecionada = 1;
		
	}
	
	public UfDao getUfdao() {
		return ufdao;
	}

	public void setUfdao(UfDao ufdao) {
		this.ufdao = ufdao;
	}

	public Integer getTabSelecionada() {
		return tabSelecionada;
	}

	public void setTabSelecionada(Integer tabSelecionada) {
		this.tabSelecionada = tabSelecionada;
	}

	public void salvar() {
		
		try {
				
		ufdao.salva(uf);		
		
		FacesContext context = FacesContext.getCurrentInstance();        
        context.addMessage(null, new FacesMessage("Sucesso!", "O cadastro da Uf " + uf.getNome() + " foi realizado"));
        
        tabConsulta = false;
		tabCadastro = true;		
		tabSelecionada = 0;
        
        atualiza();
		
		} catch (Exception e) {
			
			FacesContext context = FacesContext.getCurrentInstance();        
	        context.addMessage(null, new FacesMessage("Falha", "Problemas ao cadastrar a Uf " + uf.getNome() + " - Detalhes: " + e.getMessage() ));
			
		}
		
	}
	
	public void alterar() {		
		
		tabCadastro = false;
		tabConsulta = true;
		tabSelecionada = 1;		
        
	}
	
	public void excluir() {		
		
		try {
		
		ufdao.deleta(uf);
		
		atualiza();
		
		} catch (Exception e) {
			
			FacesContext context = FacesContext.getCurrentInstance();        
	        context.addMessage(null, new FacesMessage("Falha", "Problemas ao excluir a Uf " + uf.getNome() + " - Detalhes: " + e.getMessage() ));
			
		}
        
	}
	
	public void pesquisar() {		
		ufs = ufdao.getCampo("nome", textPesquisa);		
	}	
	
	public void limpar() {		
		uf = new Uf();		
	}
	
	public void cancelar() {
		
		limpar();
		
		tabConsulta = false;
		tabCadastro = true;		
		tabSelecionada = 0;
		
	}

}

tenta tirar esses “:” do update… por exemplo


update="tabGeral, tabConsulta, tabCadastro"

Tirei amigo, mas dai o panelGrid todo nem aparece… O mais estranho é que hora funciona, hora não funciona… =/

Veja se isso te ajuda : http://uaihebert.com/?p=1596&page=14

Olá amigo !!

Faça um teste tirando o metodo atualiza() do construtor.

public CadUf() {   
   //atualiza();   
} 

public void atualiza() {   
   ufs = ufdao.getAll();   
} 

Abraços.

Felipe Mozena

Irmão… primeiramente obrigado pelo link… já vih que tem muita coisa boa pra mim aprender ali… na página específica que você me mandou, sobre action e actionlistener… eu estou usando actionlistener que, aparentemente seria o correto… né?

Porém eu não estava assinando o parâmetro actionEvent… Mudei isto, porém não mudou o comportamento não… =/

Tentei também utilizar o Action, levando em consideração que eu pudesse ter interpretado erroneamente o artigo… o que também não resolveu… tem alguma outra sugestão?

[quote]Olá amigo !!

Faça um teste tirando o metodo atualiza() do construtor. [/quote]

Tentei isto amigo, mas também não resolveu…