Meu p:selectOneMenu não seta meu Enum nem com reza braba! Ajudem-me!

3 respostas
Edison_Martins

Pessoal, possuo um Enum e quero que o usuário escolha uma alternativa por meio de um p:selectOneMenu. Minha página recupera os Enums do ManagedBean e as exibe sem problemas, porém quando o usuário escolhe o enum nada acontece, ou seja, o enum não é setado.

FiltroEnum
public enum FiltroEnum {
	TODOS("TODOS", "0"), ATIVADAS("ATIVADAS", "1"), INATIVADAS("INATIVADAS", "2");
	
	private String key;
	private String value;
	
	private FiltroEnum(String key, String value){
		this.key = key;
		this.value = value;
	}
	
	public String getKey() {
		return key;
	}

	public void setKey(String key) {
		this.key = key;
	}

	public String getValue() {
		return value;
	}
	
	public int getValueInteger() {
		return Integer.parseInt(value);
	}

	public void setValue(String value) {
		this.value = value;
	}

}
ManagedBean
//Enums
	private FiltroEnum filtro;
	private List<FiltroEnum> filtros;

       @PostConstruct
	public void init(){
		System.out.println("init()");
		this.filtros = Arrays.asList(FiltroEnum.values());
	}

       public FiltroEnum getFiltro() {
		return filtro;
	}

	public void setFiltro(FiltroEnum filtro) {
		this.filtro = filtro;
	}


       public List<FiltroEnum> getFiltros() {
		return filtros;
	}

	public void setFiltros(List<FiltroEnum> filtros) {
		this.filtros = filtros;
	}


        public void preparaDataTable(){
		int filtro = Integer.parseInt(this.filtro.getValue());
		this.ras = this.getRArepository().getLista(filtro);
		Collections.sort(this.ras);
	}
xhtml
<h:panelGrid columns="2">
		<p:outputLabel value="Exibir:" for="exibir-select" styleClass="label"  />
		<p:selectOneMenu id="ra-exibir-select" value="#{rABean.filtro}" >
				
				<f:selectItems value="#{rABean.filtros}" var="f"
					itemLabel="#{f.key}" itemValue="#{f}"  />
				
				<p:ajax listener="#{rABean.preparaDataTable()}" update="dataTable"/>

			</p:selectOneMenu>
		
	</h:panelGrid>


Desde já. agradeço a ajuda!

3 Respostas

thiago_dias

Como se trata de enum, acredito que você vai precisar de um converter.

[]'s

Edison_Martins

Pois é, eu vi vários exemplos que não usavam enums. Vi que não precisa, mas mesmo assim fiz um.

FiltroEnumConveter

@FacesConverter(forClass=FiltroEnum.class, value="filtroEnumConverter")
public class FiltroEnumConverter extends EnumConverter implements Converter {

	@Override
	public Object getAsObject(FacesContext context, UIComponent componente, String enumKey) {
		for (FiltroEnum filtro : FiltroEnum.values()) {
			if(enumKey.equalsIgnoreCase(filtro.getKey())){
				return filtro;
			}
		}
		
		return null;
	}

	@Override
	public String getAsString(FacesContext context, UIComponent component, Object filtroEnum) {
		for (FiltroEnum filtro : FiltroEnum.values()) {
			if(filtroEnum.equals(filtro)){
				return filtro.getKey();
			}
		}
		return null;
	}

}


xhtml

<h:panelGrid columns="2">
		<p:outputLabel value="Exibir:" for="ra-exibir-select" styleClass="label"  />
		<p:selectOneMenu id="ra-exibir-select" value="#{rABean.filtro}" converter="filtroEnumConverter" >
				
				<f:selectItems value="#{rABean.filtros}" var="f"
					itemLabel="#{f}" itemValue="#{f}"  />
				
				<p:ajax listener="#{rABean.preparaDataTable()}" update="ra-dataTable"/>

			</p:selectOneMenu>
		
	</h:panelGrid>

E mesmo assim nada!

Edison_Martins

Esqueci de colocar o panelGrid dentro do h:form

XHTML - CORRETO

<h:form>
		<h:panelGrid columns="2">
			<p:outputLabel value="Exibir:" for="exibir-select"
				styleClass="label" />


			<p:selectOneMenu id="exibir-select" value="#{rABean.filtro}">

				<f:selectItems value="#{rABean.filtros}" var="f"
					itemLabel="#{f.key}" itemValue="#{f}" />

				<p:ajax listener="#{rABean.preparaDataTable()}"
					update=":localidade-listarView:dataTable" />

			</p:selectOneMenu>
</h:form>
Criado 11 de maio de 2013
Ultima resposta 11 de mai. de 2013
Respostas 3
Participantes 2