[RESOLVIDO] Primefaces - Botão não chama método

13 respostas
Cledsonjr

Boa tarde.

Estou com um problema e não sei o pq.

Tenho um dialog com um dataTable dentro. Esse dataTable fica carregando toda vez que eu abro a página e isso causa lentidão, pois ele busca os dados no BD.

Eu pensei em evitar isso criando uma condicional dentro do List que popula o dataTable e essa condicional está funcionando.

Quando entro na página o sistema n carrega os dados do dataTable como eu queria, apenas carrega quando eu chamo o dialog em que o dataTable está.

Dentro do Dialog eu trabalho normalmente. Quando eu clico em sair eu devo chamar o método que “liberou” o uso do dataTable e mudar o valor do atributo. Este é o problema o botão sair não chama o método e nesse form ainda tenho mais 1 botão que está funcionando normalmente.

Segue o código:

Este botão está dentro do mesmo form que o botão Gravar, mas o Gravar funciona.

<p:commandButton value="Sair"
					actionListener="#{cadastrarCategoriaControle.carregarCategoria}"
					update=":listaCategoria:tabelaCategoria"
					oncomplete="dialogGerCategoria.hide()"/>

O método para “liberar” ou não o carregamento do dataTable.

public void carregarCategoria(){
		System.out.println("VALOR INICIAL" + carregarListaCategoria);
		if (carregarListaCategoria == true) {
			System.out.println("Valia TRUE mudando para FALSE");
			carregarListaCategoria = false;
		}
		else if(carregarListaCategoria == false){
			System.out.println("Valia FALSE mudando para TRUE");
			carregarListaCategoria = true;
		}
	}

Detalhe, eu libero o dataTable em um menu e esse menu está funcionando a primeira vez quando clico ele muda para true a segunda ele muda para false.

Alguem sabe o pq o bottão não está funcionando?

13 Respostas

lele_vader

Você não está trocando para false.

Cledsonjr

Vlw pela resposta.

Esse erro foi na hora de colar o código aqui. Aprontei um rolo dai acabou ficando assim, mas no código está certo.

Muito estranho isso, pois como você deve ter percebido coloquei alguns println() para ver se estava passando, quando clico no menu que chama esse método aparece as mensagens na tela, mas quando clico no botão nada acontece ele apenas da o update no form.

lele_vader

Como e esse menu ?

Como carrega os dados dele ?

Cledsonjr

lele_vader:
Como e esse menu ?

Como carrega os dados dele ?

<p:megaMenu autoDisplay="false">  
 <p:submenu label="Tabelas Diversas" icon="ui-icon-document">  
  
            <p:column>  
                <p:submenu label="Cadastrar">  
                <p:menuitem value="Categoria/Convênios" 
                oncomplete="dialogGerCategoria.show()" 
                update=":listaCategoria:tabelaCategoria" 
                actionListener="#{cadastrarCategoriaControle.carregarCategoria}"/>  
                </p:submenu> 
            </p:column>  
        </p:submenu>  
  </p:megaMenu>

Esse é o menu. Ele apenas faz um actionListener que funciona e da um update no dialog que têm o dataTable dentro.
Por exemplo:

A primeiva vez que clico nele ele troca o valor da variável para true e apartir dai o dataTable lista os dados a segunda vez ele troca para false e o sistema para de listar o dataTable e assim quantas vezes eu clicar.

lele_vader

Cade o botão sair e a implementação dele.

Cledsonjr

Vou postar o dialog todo para te dar uma idea melhor de como eu fiz. Lembrando que o botão Gravar funciona perfeitamente.

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.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:ui="http://java.sun.com/jsf/facelets"
	xmlns:p="http://primefaces.org/ui">
<h:body>
<div id="divCadastro">
		<p:dialog 
			header="Inclusão de Categoria/Convênio"
			widgetVar="dialogGerCategoria" 
			resizable="false"
			rendered="true"
			width="900" height="500"
			modal="true" 
			id="dialogGerCategoria"
			draggable="false" 
			closable="false"
			appendToBody="false">
	<h:form id="cadastroCategoria">
				<p:panel>Categoria/Convênio
			<p:separator />
					<h:panelGrid columns="3" columnClasses="label, value"
						styleClass="grid">
						
						<h:outputLabel for="nomeCategoria" value="Nome:" />
						<h:inputText id="nomeCategoria"
							value="#{cadastrarCategoriaMB.categoria.nomeCatConv}"
							maxlength="50" size="50"
							required="true"
							requiredMessage="Nome Categoria é obrigatório." />
							<p:message for="nomeCategoria" />
							
						<h:outputLabel for="nomeCategoriaAbrev" value="Nome abreviado:" />
						<h:inputText id="nomeCategoriaAbrev"
							value="#{cadastrarCategoriaMB.categoria.nomeAbreCatConv}"
							maxlength="3" size="3" 
							required="true"
							requiredMessage="Nome Abreviado é obrigatório."/>
							<p:message for="nomeCategoriaAbrev" />
					<h:outputLabel for="textArea" value="OBS:" />
					
					</h:panelGrid>
					
					<h:inputTextarea rows="1" cols="70"
					value="#{cadastrarCategoriaMB.categoria.obs}"></h:inputTextarea>
				</p:panel>
				<h:panelGrid columns="4" columnClasses="label, value"
					styleClass="grid">
			<!-- ############################# - BOTÕES - ############################# -->		
					<p:commandButton value="Gravar"
						actionListener="#{cadastrarCategoriaControle.salvarCategoriaCliente}" 
						update="cadastroCategoria, :listaCategoria:tabelaCategoria"
						oncomplete="dialogGerCategoria.show()"/>
					
					<p:commandButton value="Limpar" 
					update="cadastroCategoria"
					actionListener="#{cadastrarCategoriaMB.inicializarObjetos}"/>
					
					<p:commandButton value="Sair"
					actionListener="#{cadastrarCategoriaControle.carregarCategoria}"
					update=":listaCategoria:tabelaCategoria"
					oncomplete="dialogGerCategoria.hide()"/>
				<!-- ########################################################## -->		
				</h:panelGrid>
			</h:form>
			
			<h:form id="listaCategoria">  
			<p:dataTable id="tabelaCategoria" 
				lazy="true"
				var="categoria"
				value="#{cadastrarCategoriaControle.listarTodasCategorias}"
				rows="5"
				paginator="true"
				emptyMessage="Nenhuma categoria/convênio cadastrada!">
				
        <p:column headerText="Código">  
            <h:outputText value="#{categoria.codigoCategoria}" />  
        </p:column>  
  
        <p:column headerText="Nome">  
            <h:outputText value="#{categoria.nomeCatConv}" />  
        </p:column>  
  
        <p:column headerText="Nome Abreviado">  
            <h:outputText value="#{categoria.nomeAbreCatConv}" />  
        </p:column>  
  
        <p:column headerText="Manter">  
        	<p:commandButton icon="ui-icon-close" update=":listaCategoria" actionListener="#{cadastrarCategoriaControle.deletarCategoriaCliente}"/>
            <p:commandButton icon="ui-icon-document"/> 
        </p:column>  
    </p:dataTable>  
</h:form>
		</p:dialog>
	</div>
</h:body>
</html>
lele_vader

Vendo rapidamente no sair você não está atualizando o form.

Cledsonjr

Pior que estou. É pq são dois forms tentei com apenas um e tbm não funcionou. Nesse exemplo estou atualizando apenas o segundo form que é o form do dataTable.

igor_ks

tenta colocar um ajax=false no commandButton

Cledsonjr

Obrigado pela ajuda, mas ainda não funcionou.

Vou dar um chute:

Será que pode ser algo como “semáforo”, sei lá. hehe

Tipo o método está sendo impedido de ser acessado por outro evento?

Existe algo assim nativo do Primefaces?

Mas ainda fico com algum erro noob meu. :frowning:

G

<p:commandButton value="Sair" actionListener="#{cadastrarCategoriaControle.carregarCategoria}" update=":listaCategoria:tabelaCategoria" oncomplete="dialogGerCategoria.hide()" immediate="true" process="@this"/>

Insira as propriedades immediate com o valor true, pra pular toda parte de validação do formulario.
Também insira a propriedade process para apenas ser submetido este botão.

Cledsonjr

grinche:
<p:commandButton value="Sair" actionListener="#{cadastrarCategoriaControle.carregarCategoria}" update=":listaCategoria:tabelaCategoria" oncomplete="dialogGerCategoria.hide()" immediate="true" process="@this"/>

Insira as propriedades immediate com o valor true, pra pular toda parte de validação do formulario.
Também insira a propriedade process para apenas ser submetido este botão.

Muito obrigado! Agora aprendi mais duas novas propriedades. hehe

Obrigado a todos pela ajuda.

fagajr

Cledsonjr:
Boa tarde.

Estou com um problema e não sei o pq.

Tenho um dialog com um dataTable dentro. Esse dataTable fica carregando toda vez que eu abro a página e isso causa lentidão, pois ele busca os dados no BD.

Eu pensei em evitar isso criando uma condicional dentro do List que popula o dataTable e essa condicional está funcionando.

Quando entro na página o sistema n carrega os dados do dataTable como eu queria, apenas carrega quando eu chamo o dialog em que o dataTable está.

Dentro do Dialog eu trabalho normalmente. Quando eu clico em sair eu devo chamar o método que “liberou” o uso do dataTable e mudar o valor do atributo. Este é o problema o botão sair não chama o método e nesse form ainda tenho mais 1 botão que está funcionando normalmente.

Segue o código:

Este botão está dentro do mesmo form que o botão Gravar, mas o Gravar funciona.

<p:commandButton value="Sair"
					actionListener="#{cadastrarCategoriaControle.carregarCategoria}"
					update=":listaCategoria:tabelaCategoria"
					oncomplete="dialogGerCategoria.hide()"/>

O método para “liberar” ou não o carregamento do dataTable.

public void carregarCategoria([u][b]ActionEvent e[/b][/u]){
		System.out.println("VALOR INICIAL" + carregarListaCategoria);
		if (carregarListaCategoria == true) {
			System.out.println("Valia TRUE mudando para FALSE");
			carregarListaCategoria = false;
		}
		else if(carregarListaCategoria == false){
			System.out.println("Valia FALSE mudando para TRUE");
			carregarListaCategoria = true;
		}
	}

Detalhe, eu libero o dataTable em um menu e esse menu está funcionando a primeira vez quando clico ele muda para true a segunda ele muda para false.

Alguem sabe o pq o bottão não está funcionando?

não sei se você já conseguiu resolver e também não sei se é regra do JSF, mas quando tem um actionListener no seu XHTML o método requer um parâmetro ActionEvent e.

abs

Criado 10 de outubro de 2012
Ultima resposta 13 de mai. de 2013
Respostas 13
Participantes 5