JSF - SelectOneMenu

10 respostas
vinicius.me

Boa noite,

Então galera não estou conseguindo popular um SelectOneMenu :oops:

To precisando de uma ajudazinha…segue o codigo…

CategoriaController.java

public DataModel getTodos() throws Exception {
        InterfaceCategoriaDAO idao = new CategoriaDAO();
        model = new ListDataModel(idao.todos());
        return model;
    } //todas as categorias

subcategoria.jsp

<h:outputText value="Categoria" />
                            <h:selectOneMenu id="categoria" value="#{subcategoria.subcategoria.categoria}">
                                <f:selectItem value="#{categoria.todos}" />
                            </h:selectOneMenu>

Tudo bem que os tipos sã diferentes e talz, mas na achei que me ajudasse mt com isso…
Queria saber o melhor jeito (não necessariamente o mais fácil) de popular esse SelectOneMenu, poderia estar usando um converter? Nada a ver?

10 Respostas

thiagotn

Para popular um SelectOneMenu você precisa passar um lista de SelectItem:

Por exemplo:

private List items;

 public DataModel getTodos() throws Exception {  
         InterfaceCategoriaDAO idao = new CategoriaDAO();  
         model = new ListDataModel(idao.todos());  

         for( Categoria categoria : model ){
             items.add(new SelectItem( categoria, categoria.toString()));
         }

         return items;  
     } //todas as categorias
vinicius.me

Com isso poderia usar o mesmo método (getTodos) para popular um DataTable normalmente???

thiagotn

Para o dataTable utilize o método que retorna todos:

private List items;

// DataTable
 public DataModel getTodos() throws Exception {  
         InterfaceCategoriaDAO idao = new CategoriaDAO();  
         model = new ListDataModel(idao.todos());  
         return model;  
     } //todas as categorias 

// SelectItems
private void selectItemsCategoria(List dados) {
		for (Categoria c : dados) {
			items.add(new SelectItem(c, c.toString()));
		}
	}

selectCategoria(getTodos());

No seu jsp:

<h:selectOneMenu id="categorias" value="#{subcategoria.subcategoria.categoria}" >
        <f:selectItems value="#{estruturaCarreiraCargoController.items}"/>
</h:selectOneMenu>
vinicius.me

OK, deu certo aqui, codigo ficou assim

public ArrayList<SelectItem> getTodosList() throws Exception {
        ArrayList<SelectItem> list = new ArrayList();
        InterfaceCategoriaDAO idao = new CategoriaDAO();
        List listaCategoria = idao.todos();

        for(int i = 0; i < listaCategoria.size(); i++) {
            Categoria cat = (Categoria) listaCategoria.get(i);
            list.add(new SelectItem(cat.getId(), cat.getNome()));
        }
        
        return list;
    } //retorna todas as Categorias (SelectOneMenu - ComboBox)

Acho que não seja a melhor maneira, depois eu do uma estuda no codigo, po hora esta OK…
Porém, :smiley: , sem qrer abusar, mas jah abusando…

Estou utilzando JPA, e essa categoria da SelectOneMenu é uma FK para Subcategoria…
Certo, vou em subcategoria, digo um nome qlqr e pego uma categoria da SelectOneMenu, mas qnd tento salvar aparece o erro:

Conversion Error setting value ‘1’ for ‘null Converter’.

Onde 1 é o id da categoria selecionada no SelectOneMenu…
Já passou por isso? Tem alguma dica?

Obrigado, ajudou bastante :smiley:

thiagotn

Tem uma dica interessante sobre erro de validação com SelectOnMenu aqui.

vinicius.me

Boa noite galera!!!

Então, consegue resolver o problema do selectonemenu gracas principalmente ao thiagotn…
Mas to com outro probleminha!!

Preciso que um selectonemenu pegue os dados de acordo com os dados de outro, naquele esquema de selecionar estado em um, e o outro preenche com as Cidades…so que no meu caso eh Categoria e Subcategoria…

Segue o codigo abaixo…se alguem pude me explicar oq esta errado, eu vi uma parada em algum lugar que usava um metodo void com um valueChange alguma coisa, alguem sabe e poderia me explicar mais ou menos com funciona…

JSP

<h:outputText value="Categoria" />
                            <h:selectOneMenu id="categoria" value="#{categoria.categoria.id}"
                                             converter="simpleIndexConverter"
                                             immediate="true" rendered="true">
                                <f:selectItems value="#{categoria.todosList}" />
                                <a4j:support event="onchange" action="#{categoria.todosSubcategoriaList}"
                                             immediate="true" reRender="subcategoria"/>
                            </h:selectOneMenu>

                            <h:outputText value="Subcategoria"/>
                            <h:selectOneMenu id="subcategoria" value="#{subcategoria.subcategoria.id}"
                                             converter="simpleIndexConverter" rendered="true">
                                <f:selectItems value="#{categoria.todosSubcategoriaList}"/>
                            </h:selectOneMenu>

Managerbean Categoria

public ArrayList<SelectItem> getTodosList() throws Exception {
        list = new ArrayList<SelectItem>();

        InterfaceCategoriaDAO idao = new CategoriaDAO();
        List listaCategoria = idao.todos();

        for (int i = 0; i < listaCategoria.size(); i++) {
            Categoria cat = (Categoria) listaCategoria.get(i);
            list.add(new SelectItem(cat, cat.getNome()));
        }

        return list;
    } //retorna todas as Categorias (SelectOneMenu - ComboBox)

    public ArrayList<SelectItem> getTodosSubcategoriaList() {
        list = new ArrayList<SelectItem>();

        List listaSubcategoria = (List) new Categoria().getSubcategorias();

        for(int i = 0; i < listaSubcategoria.size(); i++) {
            Subcategoria subcat = (Subcategoria) listaSubcategoria.get(i);
            list.add(new SelectItem(subcat, subcat.getNome()));
        }

        return list;
    } //retorna todas as subcategorias de uma categoria

Obrigado!!!

thiagotn

Você pode fazer algo parecido com isso:

<h:outputLabel value="Estado" />
<h:selectOneMenu required="true" style="overflow: auto;width: 160px;" valueChangeListener="#{localidades.estadosValueChange}" value="#internautaController.internauta.estado}" partialSubmit="true">
<f:selectItems value="#{localidades.estados}"/>
</h:selectOneMenu>		                		                

<h:outputLabel value="Cidade" />
<h:selectOneMenu required="true" style="overflow: auto;width: 160px;" value="#{internautaController.internauta.cidade}" >
<f:selectItems value="#{localidades.cidades}"/>
</h:selectOneMenu>

e no seu Managed Bean

public void estadosValueChange(ValueChangeEvent e) {
	Estado estado = (Estado) e.getNewValue();
	setCidades(estado);
}
    
public void setCidades(Estado estado){
    	populateCidades(estado.getCidades());
}
vinicius.me

Voce não teria um examplo usando o a4j:support???

Obrigado.

thiagotn

Não tenho, infelizmente. Mas não deve ser algo muito diferente deste exemplo que lhe passei.

Pesquise sobre ValueChangeEvent utilizando a4j:support e SelectOneMenu.

gilsonk

Galera, boa tarde!
Duvida de iniciante usando h:selectOneMenu!

Ao clicar no menu, estou chamando a página populando a primeira combo com o primeiro contrato conforme segue:

<h:selectOneMenu id="comboContrato" value="#{ManterASC.asc.num_contrato_cff}" tabindex="0" style="width:300px;">
                                <f:selectItems value="#{ManterContrato.listarParaCombo}"/>
                                <!--<a4j:support event="onload" oncomplete="#{ManterASC.listarParaCombo}"/>-->
                                <!--<a4j:support event="onblur" reRender="lstCrudOS,comboASC" ajaxSingle="true"/>-->
                                <a4j:support event="onchange" reRender="lstCrudOS,comboASC" action="#{ManterOS.limparDados}" ajaxSingle="true"/>
                            </h:selectOneMenu>

Até aqui, sem problemas…
Essa combo deveria estar populando a segundo combo mostrando o primeiro item desta, como segue:

<h:selectOneMenu id="comboASC" value="#{ManterOS.os.num_asc}" tabindex="0" style="width:300px;">
                                <f:selectItems value="#{ManterASC.listarParaCombo}"/>
                                <a4j:support event="onchange" reRender="lstCrudOS,painelListagem,painelSemListagem" ajaxSingle="true"/>
                            </h:selectOneMenu>

A primeira combo esta sendo populada corretamente, porem não carrega a segunda sem uma ação do usuário,
testados os eventos onload, onblur, oncomplete, etc… inclui o tabindex=“0” porém sem sucesso!
A unica forma que esta funcionando é com o evento onchange!
Mas preciso que os dados venham listados quando selecionar a opção no menu “rich:menuItem”.
Para completar, esta segundo combo lista uma tabela “rich:dataTable”.

Att

Alguma outra idéia ou dica?

Criado 1 de junho de 2009
Ultima resposta 22 de dez. de 2010
Respostas 10
Participantes 3