[RESOLVIDO] <h:SelectOneMenu> primeiro item vazio, é possível?

6 respostas
H

Seguinte galera,

Estou usando vários selectOneMenu no meu projeto, porém, em alguns casos, eu não preciso selecionar nada, ou seja, o campo precisa ter o primeiro item vazio.

No selectItems, eu passo um List, só que dessa forma, eu fico sem a opção de “sem seleção” do SelectOneMenu. O que eu fazia anteriormente, era pegar minha lista e converter manualmente para uma lista de SelectItem e na hora dessa conversão, adicionar um vazio na primeira posição da lista.

Só que isso não é uma boa prática, então decidi criar um converter específico pra cada objeto diferente que eu tenho. Sendo assim, não posso inserir um objeto null no início da lista que dá erro.

Existe alguma forma de inserir ou deixar o SelectOneMenu com uma seleção vazia?

6 Respostas

K

coloque um <f:selectItem/> com itemLabel="" antes do <f:selectItems/>

R

Pode ser feito assim:

<h:selectOneMenu value="#{seuMB.uf}" id="cmbUF">
	<f:selectItem itemLabel="Selecionar"  noSelectionOption="true"/>
	<f:selectItems value="#{seuMB.listUf}" />
</h:selectOneMenu>
H

Valew pelo Help.

Tinha tentado com ItemValue, nem arrisquei tentar só com o ItemLabel. Como sempre, às vezes ficamos parados tentando resolver um problema cuja solução está debaixo do nariz… :smiley:

Muito Obrigado Rafael e Kanin, a solução proposta funcionou perfeitamente! :wink:

R

Aproveitando o tópico deixa eu colocar uma questão:

fiz um selectOneMenu ligado diretamente com uma Entity do Hibernate exemplo:

<h:selectOneMenu value="#{cadPessoaMB.registro.municipio}" id="cmbMunicipio">
	<f:selectItems value="#{cadPessoaMB.municipios}" var="m" itemValue="#{m.id}" itemLabel="#{m.nome}"/>
</h:selectOneMenu>

O value aponta para um objeto do tipo Municipio que é uma entity.

Então fiz um conversor:

@FacesConverter(forClass=Municipio.class)
public class MunicipioConverter  implements Converter {
	public Object getAsObject(FacesContext context, UIComponent component, String valor) {
		if(valor == null || valor.equals("null") || valor.length()==0)return null;
		return new MunicipioDao().findById(Long.valueOf(valor));
	}
 
	public String getAsString(FacesContext context, UIComponent component, Object object) {
		if(object == null)return null;
		return ((Municipio)object).getId().toString();
	}

}

Ja debuguei o conversor e ele passa certinho e também devolve o objeto correto no getAsObject.

Porém, quando eu dou o Submit no form, ele da um erro de validação. Eu preciso implementar um validator também?

H

Então cara, o meu funciona sem problemas e não utilizo tantos parâmetros no

Meu código está assim:
<h:selectOneMenu value="#{projetoMB.projeto.fkProjetoPai}" converter="projetoConverter" required="false" >                                
                <f:selectItem itemLabel=""/>
                <f:selectItems value="#{projetoMB.listaProjetoBean}"/>
</h:selectOneMenu>
E meu converter fiz de uma forma que ele busca novamente o objeto na base de dados, para garantir mesmo sua persistência.
@FacesConverter(value = "projetoConverter")
public class ProjetoConverter implements Converter {

    public Object getAsObject(FacesContext fc, UIComponent uic, String string) {
        try {
            Integer id = new Integer(string);
            ProjetoBean projeto = Service.getInstance().buscarProjeto(id);
            return projeto;
        } catch (Exception e) {
            return null;
        }
    }

    public String getAsString(FacesContext fc, UIComponent uic, Object o) {
        ProjetoBean projeto = (ProjetoBean) o;
        if (projeto != null) {
            return projeto.getId().toString();
        } else {
            return null;
        }
    }
}

PS: Notei que no seu código, o SelectOneMenu não está chamando o Converter (está automático isso?).
Não precisei usar nenhum validator. Tenho várias telas com outros objetos, funcionando da forma como mostrei acima.

R

Hericksnake:
Então cara, o meu funciona sem problemas e não utilizo tantos parâmetros no <f:selectItem>

PS: Notei que no seu código, o SelectOneMenu não está chamando o Converter (está automático isso?).

Pois é, mas comigo não vai…

Eu coloco mais parâmetros, porque, a minha lista no Managed Bean é uma lista de Entity, a sua provavelmente deve ser uma lista de SelectItem

E o meu converter está ligado direto com a classe, assim todo value que apontar para está classe vai usar esse conversor.

@FacesConverter(forClass=Municipio.class)
Criado 3 de fevereiro de 2011
Ultima resposta 3 de fev. de 2011
Respostas 6
Participantes 3