[RESOLVIDO] Problemas com ActionListener, ele só funciona 1x

13 respostas
EuclidesFilizola

Bom dia pessoal,

eu criei o seguinte componente abaixo:

Essa é uma coluna de um rich:dataTable que é um botão. Oq ele faz? Ele apenas instancia um novo objeto despesa, e assim fica um dataTable “dinamico”. Ou seja, quantas vezes vc clicar no botão, vai aparecendo linhas em brancos.

<rich:column >
	<f:facet name="header"><h:outputLabel value=""/></f:facet>
	<a4j:commandButton image="/images/bota_adicionar.png" actionListener="#{veiculoIndividualRelatorioBean.instanciarDespesa}" reRender="listaDespesas"/>
</rich:column>

Porém o problema é que ele só funciona na primeira vez.

Abaixo vai os métodos do meu Mbean.

Aqui o construtor do Mbean.

public VeiculoIndividualRelatorioBean() {
	
		this.listaDespesas.add(new Despesas());
	}

Aqui o método que é utilizado pelo aj4:commandButton.

public void instanciarDespesa(ActionEvent event){
		
		this.listaDespesas.add(new Despesas());
	}

Só pra terminar, o problema é que, eu clico no botão, na primeira vez ele gera uma linha em branco abaixo da primeira. Mas isso só funciona no primeiro botão. No mesmo botão, que fica uma linha abaixo ele não funciona. Alguém saberia me dar uma força ?

13 Respostas

lucasirc

euclides

confirma se o metodo nao esta realmente sendo executado pela segunda vez, ou se ele esta sendo executado mas não esta sendo renderizado a tela…

as vezes ele esta executando mas nao está renderizando o panel que voce quer…

abs

EuclidesFilizola

Vou verificar então se a lista tem mais de 2 objetos. Se tiver, é pq ele está “adicionando” … mas não está renderizando…

se não… é pq ele só esta executando 1 vez… vou testar isso agora.

EuclidesFilizola

Bom, ocorreu o seguinte.

Quando eu instancio esse MB, no construtor dele, eu já insiro um objeto para que a linha apareça.

assim:

public VeiculoIndividualRelatorioBean() {
	
		this.listaDespesas.add(new Despesas());
	}

Dae oq acontece.

Vai aparecer o dataTable com apenas 1 linha.

descricao -------------------- valor --------------

(em branco) ------------- (em branco) ------------- [+] .

Bom, eu insero os valores em “descricao” e “valor” e clico no " [+]" .

Dae funciona do jeito que eu quero, ele adiciona uma linha abaixo em branco, com os campos e o botão.

Porém ocorre o seguinte. Somente o botão da 1a linha é que funciona o ACtionListener, o da segunda linha ñao funciona, ou seja, vc clica e ele não executa nada. Por isso, que ele não incrementa mais linhas abaixo…

fica assim:

descricao -------------------- valor --------------

“pneu” --------------------- “20.00” ------------- [+] .

(em branco) ------------- (em branco) ------------- [+] .

deu pra entender … ?

EuclidesFilizola

e ae galera… nada ???

lucasirc

cola seu datatable ai

EuclidesFilizola
<rich:dataTable id="listaDespesas" rowClasses="even,odd"
		value="#{veiculoIndividualRelatorioBean.listaDespesas}" var="despesa"
		rows="10">
		
		<f:facet name="header">
			<h:outputLabel value="DESPESAS ADICIONAIS" />
		</f:facet>

		<rich:column>
			<f:facet name="header">
				<h:outputLabel value="Descricao" />
			</f:facet>
			<h:inputText value="#{despesa.descricao}" />
		</rich:column>

		<rich:column>
			<f:facet name="header">
				<h:outputLabel value="valor" />
			</f:facet>
			<h:inputText value="#{despesa.valorDespesa}" />
		</rich:column>

		<rich:column>
			<f:facet name="header">
				<h:outputLabel value="" />
			</f:facet>
			<a4j:commandButton image="/images/bota_adicionar.png"
				actionListener="#{veiculoIndividualRelatorioBean.instanciarDespesa}"
				reRender="listaDespesas" />
		</rich:column>
		
	</rich:dataTable>
lucasirc

a table ta dentro de a4j:form ?

fiz o teste aqui funcionou

EuclidesFilizola

pode mostrar o codigo de como vc fez??

lucasirc

segue ae

dataTable
<?xml version='1.0' encoding='UTF-8' ?> 
<!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:a4j="http://richfaces.org/a4j"
      xmlns:rich="http://richfaces.org/rich"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core">


    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    </head>

    <body>
        <a4j:form>
        <rich:dataTable id="listaDespesas" rowClasses="even,odd"
                        value="#{MyBean.despesas}" var="despesa"
                        rows="10">

            <f:facet name="header">
                <h:outputLabel value="DESPESAS ADICIONAIS" />
            </f:facet>

            <rich:column>
                <f:facet name="header">
                    <h:outputLabel value="Descricao" />
                </f:facet>
                <h:inputText value="#{despesa.nome}" />
            </rich:column>

            <rich:column>
                <f:facet name="header">
                    <h:outputLabel value="valor" />
                </f:facet>
                <h:inputText value="#{despesa.descricao}" />
            </rich:column>

            <rich:column>
                <f:facet name="header">
                    <h:outputLabel value="" />
                </f:facet>
                <a4j:commandButton value="+"
                                   actionListener="#{MyBean.inserir}"
                                   reRender="listaDespesas" />
            </rich:column>

        </rich:dataTable>
</a4j:form>


    </body>
</html>
MyBean.java
import java.util.ArrayList;
import javax.faces.event.ActionEvent;

/**
 *
 * @author Lucas
 */
public class MyBean {
    private ArrayList<Despesa> despesas;
    
    public MyBean() {
        despesas=new ArrayList<Despesa>();
        despesas.add(new Despesa());
    }

    public ArrayList<Despesa> getDespesas() {
        return despesas;
    }

    public void setDespesas(ArrayList<Despesa> despesas) {
        this.despesas = despesas;
    }
    
    public void inserir(ActionEvent event ) {
        despesas.add(new Despesa());
    }
}
EuclidesFilizola

eu acredito que meu código é 95% semelhante ao seu e continua sem funcionar.

aqui está minha xhtml.

&lt;?xml version='1.0' encoding='UTF-8'?&gt;

&lt;!DOCTYPE root PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;

&lt;ui:composition xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:a4j="http://richfaces.org/a4j"
	xmlns:rich="http://richfaces.org/rich"
	xmlns:c="http://java.sun.com/jstl/core"&gt;
	&lt;f:loadBundle basename="label" var="lb" /&gt;

	&lt;div class="innerTitle"&gt;Relatorio de Cacamba Individual&lt;/div&gt;

	&lt;table id="headerReport"&gt;

		&lt;tr&gt;
			&lt;td style="padding-right: 5px;"&gt;
			&lt;div class="innerTextFilter"&gt;Equipamento&lt;/div&gt;

			&lt;h:selectOneMenu id="listaClientes"
				value="#{veiculoIndividualRelatorioBean.equipamentoId}"
				style="width: 120px"&gt;
				&lt;f:selectItem itemLabel="Selecione Veiculo" /&gt;
				&lt;f:selectItems value="#{veiculosBean.listaVeiculosFicha}" /&gt;
			&lt;/h:selectOneMenu&gt;&lt;/td&gt;

			&lt;td style="padding-right: 5px;"&gt;
			&lt;div class="innerTextFilter"&gt;Obra&lt;/div&gt;

			&lt;h:selectOneMenu id="listaObras"
				value="#{veiculoIndividualRelatorioBean.obraId}"
				style="width: 120px"&gt;
				&lt;f:selectItem itemLabel="Selecione a Obra" /&gt;
				&lt;f:selectItems value="#{jazidaBean.obras}" /&gt;
			&lt;/h:selectOneMenu&gt;&lt;/td&gt;

			&lt;td style="padding-right: 5px;"&gt;
			&lt;div class="innerTextFilter"&gt;Proprietario&lt;/div&gt;

			&lt;h:selectOneMenu id="listaProprietarios"
				value="#{veiculoIndividualRelatorioBean.proprietarioId}"
				style="width: 120px"&gt;
				&lt;f:selectItem itemLabel="Selecione o Proprietario" /&gt;
				&lt;f:selectItems value="#{obraBean.proprietarios}" /&gt;
			&lt;/h:selectOneMenu&gt;&lt;/td&gt;


			&lt;td style="padding-right: 5px;"&gt;&lt;h:outputLabel
				value="Data de Inicio" /&gt;<br />
			&lt;rich:calendar id="dataInicioCadastro"
				value="#{veiculoIndividualRelatorioBean.dataInicial}"
				datePattern="dd/MM/yyyy" /&gt;&lt;/td&gt;
			&lt;td style="padding-right: 5px;"&gt;&lt;h:outputLabel
				value="Data do Fim" /&gt;<br />
			&lt;rich:calendar id="dataFimCadastro"
				value="#{veiculoIndividualRelatorioBean.dataFinal}"
				datePattern="dd/MM/yyyy" /&gt;&lt;/td&gt;
			&lt;td style="padding-right: 5px;"&gt;&lt;h:outputLabel
				value="#{lb.vlrm3km}" /&gt;<br />
			&lt;h:inputText value="#{veiculoIndividualRelatorioBean.vlrM3Km}" /&gt;&lt;/td&gt;
			&lt;td style="padding-left: 10px; padding-top: 10px;"&gt;&lt;a4j:commandButton
				id="btnPesquisar" value="Pesquisar"
				actionListener="#{veiculoIndividualRelatorioBean.gerarRelatorio}"
				styleClass="button" /&gt;&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/table&gt;


	&lt;rich:dataTable id="listaDespesas" rowClasses="even,odd"
		value="#{veiculoIndividualRelatorioBean.listaDespesas}" var="despesa"
		rows="10"&gt;
		
		&lt;f:facet name="header"&gt;
			&lt;h:outputLabel value="DESPESAS ADICIONAIS" /&gt;
		&lt;/f:facet&gt;

		&lt;rich:column&gt;
			&lt;f:facet name="header"&gt;
				&lt;h:outputLabel value="Descricao" /&gt;
			&lt;/f:facet&gt;
			&lt;h:inputText value="#{despesa.descricao}" /&gt;
		&lt;/rich:column&gt;

		&lt;rich:column&gt;
			&lt;f:facet name="header"&gt;
				&lt;h:outputLabel value="valor" /&gt;
			&lt;/f:facet&gt;
			&lt;h:inputText value="#{despesa.valorDespesa}" /&gt;
		&lt;/rich:column&gt;

		&lt;rich:column&gt;
			&lt;f:facet name="header"&gt;
				&lt;h:outputLabel value="" /&gt;
			&lt;/f:facet&gt;
			&lt;a4j:commandButton image="/images/bota_adicionar.png"
				actionListener="#{veiculoIndividualRelatorioBean.instanciarDespesa}"
				reRender="listaDespesas" /&gt;
		&lt;/rich:column&gt;
		
	&lt;/rich:dataTable&gt;

&lt;/ui:composition&gt;

lembrando que eu n tenho formularios nem body… é tudo component.

… e aqui está meu mbean

/**
 * @author Euclides Filizola
 *
 */

@Scope("request")
@Component("veiculoIndividualRelatorioBean")

public class VeiculoIndividualRelatorioBean extends EntityBean&lt;Integer, Veiculos&gt;{

	
	private static final long serialVersionUID = 1L;
	
	@Autowired
	private VeiculosService service;

	@Autowired
	private AbastecimentoService abastecimentoService;
	
	@Autowired
	private ObraService obraService;
	
	@Autowired
	private ProprietarioService proprietarioService;
	
	private Integer equipamentoId;

	private Integer obraId;
	
	private Integer numFicha;
	
	private String placaId;
	
	private Integer item;
	
	private Connection conexao;
	
	private Date dataInicial;
	
	private Date dataFinal;
	
	private Float vlrM3Km;
	
	private Integer proprietarioId;
	
	private List&lt;Despesas&gt; listaDespesas;
	/**
	 * 
	 */
	public VeiculoIndividualRelatorioBean() {
	
		this.listaDespesas = new ArrayList&lt;Despesas&gt;();
		
		this.listaDespesas.add(new Despesas());
	}
	
	int cont=0;
	
	public void instanciarDespesa(ActionEvent event){
		
		this.listaDespesas.add(new Despesas());
		System.out.println("TAMANHO 0: "+cont);
		
		cont++;
		
		System.out.println("TAMANHO: "+cont);
	
		
	}
	
		public void setEquipamentoId(Integer equipamentoId) {
		this.equipamentoId = equipamentoId;
	}


	public Integer getEquipamentoId() {
		return equipamentoId;
	}


	public void setPlacaId(String placaId) {
		this.placaId = placaId;
	}


	public String getPlacaId() {
		return placaId;
	}


	public Date getDataInicial() {
		return dataInicial;
	}


	public void setDataInicial(Date dataInicial) {
		this.dataInicial = dataInicial;
	}


	public Date getDataFinal() {
		return dataFinal;
	}


	public void setDataFinal(Date dataFinal) {
		this.dataFinal = dataFinal;
	}


	public void setNumFicha(Integer numFicha) {
		this.numFicha = numFicha;
	}


	public Integer getNumFicha() {
		return numFicha;
	}



	public void setVlrM3Km(Float vlrM3Km) {
		this.vlrM3Km = vlrM3Km;
	}


	public Float getVlrM3Km() {
		return vlrM3Km;
	}


	public void setObraId(Integer obraId) {
		this.obraId = obraId;
	}


	public Integer getObraId() {
		return obraId;
	}


	public void setItem(Integer item) {
		this.item = item;
	}


	public Integer getItem() {
		return item;
	}


	public void setConexao(Connection conexao) {
		this.conexao = conexao;
	}


	public void setProprietarioId(Integer proprietarioId) {
		this.proprietarioId = proprietarioId;
	}


	public Integer getProprietarioId() {
		return proprietarioId;
	}


	public void setListaDespesas(List&lt;Despesas&gt; listaDespesas) {
		this.listaDespesas = listaDespesas;
	}


	public List&lt;Despesas&gt; getListaDespesas() {
		return listaDespesas;
	}


	
	
}

e continua sem funcionar…

lucasirc

cara

eu acho que seria
@Scope(“session”)

EuclidesFilizola

Bom, esse Mbean não pode ser do tipo Session, mas vc resolveu meu problema.

eu coloquei um a4j keepAlive e FUNCIONOU.

valeu cara… muito obrigado.

problema resolvido.

abaixo só mudei o seguinte trecho

&lt;a4j:keepAlive beanName="veiculoIndividualRelatorioBean" /&gt;

abraços.

lucasirc

eu estava pensando aqui como fazer com request (ainda to aprendendo jsf), ia pesquisa no google…

Criado 23 de agosto de 2011
Ultima resposta 23 de ago. de 2011
Respostas 13
Participantes 2