Problemas ao usar o setPropertyActionListener dentro de um menuitem

6 respostas
D

Pessoal,

Estou com o seguinte problema: eu tenho um menu na minha aplicação. Eu preciso que dependendo do menuitem clicado pelo usuário, uma variável seja setada com um determinado valor. Esse valor será paramêtro de um método da classe bean. Infelizmente não estou conseguindo fazer isso.
O código do menu é o seguinte:

<p:submenu label="Exibição" icon="ui-icon-video">
							<p:submenu label="Quantitativo">
								<p:menuitem value="Diurno" url="ExibicaoQuantitativo.jsf">
									<f:setPropertyActionListener target="#{exibicaoQuantitativoBean.plantaoSelecionado}" value="1"></f:setPropertyActionListener>
								</p:menuitem> 
								<p:menuitem value="Noturno" url="ExibicaoQuantitativo.jsf">
									<f:setPropertyActionListener target="#{exibicaoQuantitativoBean.plantaoSelecionado}" value="2"></f:setPropertyActionListener>
								</p:menuitem> 
							</p:submenu>
							<p:menuitem value="Mensagens" url="ExibicaoMensagem.jsf"></p:menuitem>
							
						</p:submenu>

Eu preciso que quando o usuário clique o menuitem Diurno, a variável plantaoSelecionado seja setada com o valor 1, e se o menuitem Noturno for clicado, a variável plantaoSelecionado seja setada com o valor 2.

O meu Bean:

package br.pe.gov.ses.pme.mb;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.bean.ViewScoped;
import javax.inject.Inject;

import br.pe.gov.ses.pme.dao.DAO;
import br.pe.gov.ses.pme.dao.EspecialidadeDAO;
import br.pe.gov.ses.pme.dao.ExibicaoQuantitativoDAO;
import br.pe.gov.ses.pme.dao.QuantitativoDAO;
import br.pe.gov.ses.pme.modelo.Especialidade;
import br.pe.gov.ses.pme.modelo.Hospital;
import br.pe.gov.ses.pme.modelo.Mensagem;
import br.pe.gov.ses.pme.modelo.Quantitativo;

@ManagedBean
@SessionScoped
public class ExibicaoQuantitativoBean {

	private Especialidade especialidade = new Especialidade(); //especialidade que será exibida
	
	private Hospital hospital = new Hospital();
	
	private Quantitativo quantitativo = new Quantitativo(); //contém o número de especialistas e de encaminhamentos realizados
	
	private List<Especialidade> listaEspecialidade;
	
	private List<Hospital> listaHospital;
	
	private List<Quantitativo> listaQuantitativo; //lista dos quantitativos cadastrados
	
	private List<Quantitativo> listaQuantitativoApresentado = new LinkedList<Quantitativo>(); //lista dos quantitativos que serão apresentados no painel
	
	private DAO<Especialidade> daoEspecialidade = new DAO<Especialidade>(Especialidade.class);
	
	private DAO<Hospital> daoHospital = new DAO<Hospital>(Hospital.class);
	
	int contadorEspecialidade;
	
	int plantaoSelecionado = 1;
	
	public int getPlantaoSelecionado() {
		return plantaoSelecionado;
	}

	public void setPlantaoSelecionado(int plantaoSelecionado) {
		this.plantaoSelecionado = plantaoSelecionado;
	}

	@Inject
	private ExibicaoQuantitativoDAO quantitativoDAO;
	
	
	public ExibicaoQuantitativoBean(){
		
	}
	
	public ExibicaoQuantitativoBean(ExibicaoQuantitativoDAO dao){
		this.quantitativoDAO = dao;
	}
	
	@PostConstruct
	public void init(){
		
		this.listaQuantitativoApresentado = new ArrayList();
		this.setListaEspecialidade(this.daoEspecialidade.listarTodos()); //lista todas as especialidades cadastradas
		this.setListaHospital(this.quantitativoDAO.listarHospitaisOrdenado()); //lista todos os hospitais em ordem alfabética
	//	initListaHospital();
		this.contadorEspecialidade = 0;
		
	}
	
	/*
	 * Método que carrega todos os hospitais na lista de Quantitativo que será apresentada no painel
	 */
	public void initListaHospital(){
		for(int i = 0; i < this.listaHospital.size(); i++){
			quantitativo.setHospital(this.listaHospital.get(i));
			this.listaQuantitativoApresentado.add(quantitativo);
		}

	}
	
	
	/*
	 * Método que retorna uma especialidade por vez.
	 */
	public Especialidade getEspecialidade() {

		if(this.contadorEspecialidade == this.listaEspecialidade.size()){
			this.contadorEspecialidade = 0;
			this.especialidade = this.listaEspecialidade.get(contadorEspecialidade);
			this.setListaQuantitativoApresentado(this.especialidade, 1);
		}else{
			this.especialidade = this.listaEspecialidade.get(contadorEspecialidade);
			this.contadorEspecialidade++;
			this.setListaQuantitativoApresentado(this.especialidade, this.getPlantaoSelecionado());
			
		}
		
		return especialidade;
	}

	
	/*
	 * Método que seta a listaQuantitativoApresentado com os valores para uma determinada especialidade e um determinado plantão
	 */
	public void setListaQuantitativoApresentado(Especialidade especialidade, int plantao) {
			
			//Obtendo uma lista de Quantitativos com uma determinada especialidade e determinado plantão
			List<Quantitativo> filtrado = this.quantitativoDAO.filtrarQuantitativoPorEspecialidade(especialidade, plantao);
		
			//Lista com os restantes de hospitais
			List<Quantitativo> restante = this.quantitativoDAO.setarHospitaisQuantitativo();
			
			int tamanho = filtrado.size() + restante.size();
			int indice = 0;
			
			/*System.out.println("filtrado: "+ filtrado.size());
			System.out.println("restante: "+ restante.size());*/
			
			
			this.listaQuantitativoApresentado = filtrado;
			
			for(int i = filtrado.size(); i< tamanho; i++){
				this.listaQuantitativoApresentado.add(i, restante.get(indice));
				indice++;
			}
		
			
	}


	public void setEspecialidade(Especialidade especialidade) {
		this.especialidade = especialidade;
	}

	public List<Especialidade> getListaEspecialidade() {
		return listaEspecialidade;
	}

	public void setListaEspecialidade(List<Especialidade> listaEspecialidade) {
		this.listaEspecialidade = listaEspecialidade;
	}

	public DAO<Especialidade> getDaoEspecialidade() {
		return daoEspecialidade;
	}

	public void setDaoEspecialidade(DAO<Especialidade> daoEspecialidade) {
		this.daoEspecialidade = daoEspecialidade;
	}

	public List<Hospital> getListaHospital() {
		return listaHospital;
	}

	public void setListaHospital(List<Hospital> listaHospital) {
		this.listaHospital = listaHospital;
	}

	public Hospital getHospital() {
		return hospital;
	}

	public void setHospital(Hospital hospital) {
		this.hospital = hospital;
	}

	public DAO<Hospital> getDaoHospital() {
		return daoHospital;
	}

	public void setDaoHospital(DAO<Hospital> daoHospital) {
		this.daoHospital = daoHospital;
	}

	public Quantitativo getQuantitativo() {
		return quantitativo;
	}

	public void setQuantitativo(Quantitativo quantitativo) {
		this.quantitativo = quantitativo;
	}

	public List<Quantitativo> getListaQuantitativo() {
		return listaQuantitativo;
	}

	public void setListaQuantitativo(List<Quantitativo> listaQuantitativo) {
		this.listaQuantitativo = listaQuantitativo;
	}

	public List<Quantitativo> getListaQuantitativoApresentado() {
		return listaQuantitativoApresentado;
	}

	

	
}

6 Respostas

ErickRAR

E qual erro está dando?
Ah, pode ser besteira, mas tente fechar o PropertyActionListener assim:

<f:setPropertyActionListener target="#{exibicaoQuantitativoBean.plantaoSelecionado}" value="1"/>
D

O problema que está dando é que a variável plantaoSelecionado da classe ExibicaoQuantitativoBean não é setada com o valor clicado na tela.
Essa variável fica sempre com o valor 1, pois foi o valor com o qual ela foi inicializada.
Fiz um teste e inicializei essa variável com zero, e ela ficou sempre zero.

ErickRAR

Pelo que vi, isso não funciona no menuitem. Tem que fazer dessa maneira:

<p:menuitem ... actionListener="#{exibicaoQuantitativoBean.setPlantaoSelecionado(2)}" />

Qualquer coisa, aqui está a fonte.

D

Eu fiz da seguinte maneira:

<p:submenu label="Exibição" icon="ui-icon-video">
							<p:submenu label="Quantitativo">
								<p:menuitem value="Diurno" actionListener="#{exibicaoQuantitativoBean.setPlantaoSelecionado(1)}"  url="ExibicaoQuantitativo.jsf"/> 
								<p:menuitem value="Noturno" actionListener="#{exibicaoQuantitativoBean.setPlantaoSelecionado(2)}"  url="ExibicaoQuantitativo.jsf"/>
							</p:submenu>
							<p:menuitem value="Mensagens" url="ExibicaoMensagem.jsf"></p:menuitem>
							
						</p:submenu>

Mas infelizmente não deu certo. O valor da variável plantaoSelecionado continua sendo zero.

D

Eu observei o seguinte: quando retiro o campo url, a variável plantaoSelecionada é setada corretamente.

<p:submenu label="Exibição" icon="ui-icon-video">
							<p:submenu label="Quantitativo">
								<p:menuitem value="Diurno"  action="#{exibicaoQuantitativoBean.setPlantaoSelecionado(1)}" url="ExibicaoQuantitativo.jsf"  /> 
								<p:menuitem value="Noturno"   action="#{exibicaoQuantitativoBean.setPlantaoSelecionado(2)}" />
							</p:submenu>
							<p:menuitem value="Mensagens" url="ExibicaoMensagem.jsf"></p:menuitem>
							
						</p:submenu>

Será que não se pode usar action junto com a url em um menuitem?

ErickRAR

Talvez seja isso mesmo. Coloque para redirecionar dentro do maganedBean.

Criado 23 de julho de 2012
Ultima resposta 23 de jul. de 2012
Respostas 6
Participantes 2