Fórum Problema com selectonemenu dinamico[RESOLVIDO] #565246

30/05/2013

0

E ae pessoal, boa tarde, td certo ? seguinte eu estou com um problema em meu selectonemenu, gostaria de preencher o componente de acordo com o que for selecionado em meu outro selectonemenu, para isso coloquei no evento "valueChangeListener" do primeiro componente um metodo que limpa a lista do outro selectonemenu e busca novamente os itens para preencher, mas não esta acontecendo nada, estou usando facelets e nessa pagina resolvi colocar uma tag em ajax so pra recarregar o componente que vai mudar, é a primeira vez que uso ajax, pegei uma explicação bem simples de como usar, segue o codigo aew: VendaMain.xhtml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<h:selectOneMenu value="#{VendaMain.empresaSelecionada}"
                             valueChangeListener="#{VendaMain.PreencherClientes}"
                             converter="ConversorEmpresa"
                             id="cbxEmpresa">
                <f:selectItem itemLabel="Todos" itemValue="#"/>
                <f:selectItems value="#{VendaMain.listaEmpresas}"
                               var="empresas"
                               itemValue="#"
                               itemLabel="#{empresas.nome}"/>
                <f:ajax render="cbxCliente" event="valueChange"/>
            </h:selectOneMenu>
            <h:outputLabel value="Clientes :" for="lblCliente" id="lblCliente"/>
            <h:selectOneMenu value="#{VendaMain.clienteSelecionado}"
                             converter="ConversorCliente"
                             required="true" requiredMessage="Selecione um cliente"
                             id="cbxCliente">
                <f:selectItem itemLabel="Selecione um cliente" itemValue="#"/>
                <f:selectItems value="#{VendaMain.listaClientes}"
                               var="clientes"
                               itemValue="#"
                               itemLabel="#{clientes.nome}"/>
            </h:selectOneMenu>
            <h:message for="lblTelefone" errorStyle="color : red"/>
metodo que limpa o list do selectonemenu de clientes e o preenche novamente se achar registros:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public void PreencherClientes(ValueChangeEvent event){
        this.listaClientes.clear();
        Empresa empresa = (Empresa)event.getNewValue();
        if (empresa != null){
            Cliente condicaoRetorno = new Cliente();
            condicaoRetorno.setEmpresa(new Empresa());
            condicaoRetorno.setEmpresa(empresa);
            try {
                this.listaClientes = this.persistenciaCliente.selecionarClientesEmpresas(condicaoRetorno);
            } catch (Throwable ex) {
            }
        }else{
            try{
                this.listaClientes = this.persistenciaCliente.selecionar();
            }catch(Throwable ex){
                 
            }
        }
    }
eu verifiquei se nenhum momento estou recebendo uma excessão, quanto a isso o metodo esta ok, acredito que o problema esta msm na pagina jsf vlw aew
José Junior

José Junior

Responder

Posts

30/05/2013

Okabe Rintarou

Da uma olhada nesses 2 posts, podem te ajudar: http://javafree.uol.com.br/topic-889814-Erro-com-Managed-Bean.html http://javafree.uol.com.br/topic-889547-Resolvido-Duvida-gt-Select-HQL.html
Responder

Gostei + 0

30/05/2013

José Junior

kra os links ajudaram um poco, fiz umas modificações e fico assim os componentes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<h:selectOneMenu value="#{VendaMain.empresaSelecionada}"
                             converter="ConversorEmpresa"
                             id="cbxEmpresa">
                <f:selectItem itemLabel="Todos" itemValue="#"/>
                <f:selectItems value="#{VendaMain.listaEmpresas}"
                               var="empresas"
                               itemValue="#"
                               itemLabel="#{empresas.nome}"/>
                <f:ajax render="cbxCliente" event="valueChange" listener="#{VendaMain.PreencherClientes}"/>
            </h:selectOneMenu>
            <h:outputLabel value="Clientes :" for="lblCliente" id="lblCliente"/>
            <h:selectOneMenu value="#{VendaMain.clienteSelecionado}"
                             converter="ConversorCliente"
                             required="true" requiredMessage="Selecione um cliente"
                             id="cbxCliente">
                <f:selectItem itemLabel="Selecione um cliente" itemValue="#"/>
                <f:selectItems value="#{VendaMain.listaClientes}"
                               var="clientes"
                               itemValue="#"
                               itemLabel="#{clientes.nome}"/>
            </h:selectOneMenu>
agora ele recarrega o selectonemenu de clientes, mas ele não esta limpando o componente e preenchendo com outros itens ou deixando vazio so com o item fixo definido nele <f:ajax render="cbxCliente" event="valueChange" listener="#{VendaMain.PreencherClientes}"/> notei que em um dos links q você mandou a tag d ajax era de outra biblioteca, acredito que primefaces, tinha um atributo update que me parece que nessa é o render, enfim acredito que já caminhei um poco nisso, to precisando fazer ele limpar o componente agora para receber os novos valores que vem do arraylist
Responder

Gostei + 0

31/05/2013

Okabe Rintarou

Verdade, o update é do Primefaces. Vc está usando JSF Puro. Esses links com combos aninhados pode te ajudar: https://weblogs.java.net/blog/lamineba/archive/2011/05/12/implementing-cascading-dropdown-jsf-2-0 http://uaihebert.com/?p=669 http://javasemcafe.blogspot.com.br/2011/03/jsf-20-ajax-nativo.html
Responder

Gostei + 0

31/05/2013

José Junior

Kra consegui resolver, agora entendi meu erro, eu precisava usar o metodo ligado ao componente para refazer a minha select segue meu codigo modificado:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<h:selectOneMenu value="#{VendaMain.empresaSelecionada}"
                             converter="ConversorEmpresa"
                             id="cbxEmpresa">
                <f:selectItem itemLabel="Todos" itemValue="#"/>
                <f:selectItems value="#{VendaMain.listaEmpresas}"
                               var="empresas"
                               itemValue="#"
                               itemLabel="#{empresas.nome}"/>
                <f:ajax render="cbxCliente" event="change"/>
            </h:selectOneMenu>
            <h:outputLabel value="Clientes :" for="lblCliente" id="lblCliente"/>
            <h:selectOneMenu value="#{VendaMain.clienteSelecionado}"
                             converter="ConversorCliente"
                             required="true" requiredMessage="Selecione um cliente"
                             id="cbxCliente">
                <f:selectItem itemLabel="Selecione um cliente" itemValue="#"/>
                <f:selectItems value="#{VendaMain.listaClientes}"
                               var="clientes"
                               itemValue="#"
                               itemLabel="#{clientes.nome}"/>
            </h:selectOneMenu>
esse é o metodo ligado ao meu selectonemenu que troca de acordo com a seleção do primeiro
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public Cliente getClienteSelecionado() {
        this.listaClientes.clear();
        Empresa empresa = this.empresaSelecionada;
        if (empresa != null){
            Cliente condicaoRetorno = new Cliente();
            condicaoRetorno.setEmpresa(new Empresa());
            condicaoRetorno.setEmpresa(empresa);
            try {
                this.listaClientes = this.persistenciaCliente.selecionarClientesEmpresas(condicaoRetorno);
            } catch (Throwable ex) {
            }
        }else{
            try{
                this.listaClientes = this.persistenciaCliente.selecionar();
            }catch(Throwable ex){
                 
            }
        }
        return this.clienteSelecionado;
    }
kra vlw aew mais uma vez pela ajuda, pra fechar o topico gostaria de mais 2 coisas. A primeira seria para o caso de minha aplicação começar a trabalhar com muitos dados, isso iria exigir mais tempo para processar o componente, então gostaria de saber como posso implantar um recurso que já vi em muitos sites que quando a pagina ou um componente esta carregando alguma coisa, aparecer uma mensagem de "carregando" e essa mensagem inibir a tela toda até que seja totalmente processada. A segunda seria mesmo uma dica que estou precisando, a pagina seguinte dessa pagina que estou trabalhando agora é onde vou adicionar os itens para a venda que serão exibidos na tela para o usuário, até ai tudo certo, gostaria de saber qual a estrutura de dados mais indicada para o meu problema, o arraylist não resolve porque na tela você ficar adicionando, removendo e modificando os produtos da lista , isso vai gerar espaços em branco no array e eu ficar organizando o array toda hora vai fazer o desempenho do sistema cair muito, pensei em usar um linkedlist, o que vcs acham? tem alguma estrutura de dados melhor para me indicar?
Responder

Gostei + 0

31/05/2013

Okabe Rintarou

Para o item 1, pesquise sobre jsf.ajax.addOnEvent: http://www.mif.vu.lt/~donatas/PSArchitekturaProjektavimas/Library/JSF/AjaxStatusIndicator.pdf https://javaserverfaces.java.net/nonav/docs/2.0/jsdocs/symbols/jsf.ajax.html#.addOnEvent http://jamesgdriscoll.wordpress.com/2010/02/09/busy-status-indicator-with-jsf-2/ Já o item 2, um ArrayList não é um Array. O ArrayList encapsula o Array, por isso vc não precisa se preocupar com espaços vazios. Mas se você for fazer muitas buscas, de uma lida nesse artigo: http://blog.caelum.com.br/performance-hashset-em-vez-de-arraylist/
Responder

Gostei + 0

01/06/2013

José Junior

kra segui a dica do primeiro link que você me mandou:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<h:outputScript name="espera.js" library="javax.faces" target="head" />
            <h:outputLabel value="Empresas :" for="lblEmpresa" id="lblEmpresa"/>
            <h:selectOneMenu value="#{VendaMain.empresaSelecionada}"
                             converter="ConversorEmpresa"
                             id="cbxEmpresa">
                <f:selectItem itemLabel="Todos" itemValue="#"/>
                <f:selectItems value="#{VendaMain.listaEmpresas}"
                               var="empresas"
                               itemValue="#"
                               itemLabel="#{empresas.nome}"/>
                <f:ajax render="cbxCliente" event="change"/>
            </h:selectOneMenu>
            <h:outputLabel value="Clientes :" for="lblCliente" id="lblCliente"/>
            <h:selectOneMenu value="#{VendaMain.clienteSelecionado}"
                             converter="ConversorCliente"
                             required="true" requiredMessage="Selecione um cliente"
                             id="cbxCliente">
                <f:selectItem itemLabel="Selecione um cliente" itemValue="#"/>
                <f:selectItems value="#{VendaMain.listaClientes}"
                               var="clientes"
                               itemValue="#"
                               itemLabel="#{clientes.nome}"/>
            </h:selectOneMenu>
e crieri um arquivo javascritp no meu resources:
1
2
3
4
5
6
7
8
9
10
11
12
13
if (!window["busystatus"]) {
    var busystatus = {};
}
busystatus.onStatusChange = function onStatusChange(data) {
    var status = data.status;
    alert("ajax event triggered");
    if (status === "begin") { // turn on busy indicator
        element.style.display = "inline";
    } else { // turn off busy indicator, on either "complete" or "success"
        document.body.style.cursor = 'default';
    }
};
jsf.ajax.addOnEvent(busystatus.onStatusChange);
se eu deixo do jeito que foi passado no link ele não funciona e não acha a referencia do arquivo javascript
1
<h:outputScript name="espera.js" library="javax.faces" target="head" />
agora se eu aponto para o meu resources ele simplismente para de executar a minha rotina de pegar do banco os clientes cadastrados e recarregar no meu select one menu
1
<h:outputScript name="espera.js" library="js" target="head" />
Responder

Gostei + 0

01/06/2013

Okabe Rintarou

Estranho, vou fazer uns testes aqui. Vai pesquisando também.
Responder

Gostei + 0

02/06/2013

José Junior

to pesquisando aqui cara, mas o material que to achando é sempre referente ao richfaces, icefaces, primefaces, to começando a me sentir arcaico por usar jsf puro rsrs, tudo usando jsf puro parece mais chatinho de arrumar, acho que no proximo projeto que eu for fazer em jsf vo escolher algum desses que sitei, pelo menos esse projeto até que tá indo bem como meu primeiro projeto usando jsf e ta servindo para aprende
Responder

Gostei + 0

03/06/2013

Okabe Rintarou

[quote="juniorkun"]to pesquisando aqui cara, mas o material que to achando é sempre referente ao richfaces, icefaces, primefaces, to começando a me sentir arcaico por usar jsf puro rsrs, tudo usando jsf puro parece mais chatinho de arrumar, acho que no proximo projeto que eu for fazer em jsf vo escolher algum desses que sitei, pelo menos esse projeto até que tá indo bem como meu primeiro projeto usando jsf e ta servindo para aprende
Não dá para usar o PrimeFaces nesse projeto?
Responder

Gostei + 0

03/06/2013

José Junior

então cara é como falei este projeto estou usando para aprender, não eh nd assim que eu tenha que usar facelets, comecei por facelets porque achei que deveria ir do básico e talz, mas ok acho que vou ter mesmo que usar algum extra então, você esta me recomendando o primer faces, mas por curiosidade existe um melhor entre primer faces, ice faces e rich faces? ou é mais cada um se encaixa melhor em um determinado projeto ou até mesmo uma questão de gosto ? e vc tem algum ex ae para me mandar no prime faces que você esta falando pra usar ?
Responder

Gostei + 0

04/06/2013

Okabe Rintarou

[quote="juniorkun"]então cara é como falei este projeto estou usando para aprender, não eh nd assim que eu tenha que usar facelets, comecei por facelets porque achei que deveria ir do básico e talz, mas ok acho que vou ter mesmo que usar algum extra então, você esta me recomendando o primer faces, mas por curiosidade existe um melhor entre primer faces, ice faces e rich faces? ou é mais cada um se encaixa melhor em um determinado projeto ou até mesmo uma questão de gosto ? e vc tem algum ex ae para me mandar no prime faces que você esta falando pra usar ?
Eu gosto do Primefaces, mas não vejo problemas no RichFaces. Em relação a exemplos: http://www.primefaces.org/showcase/ui/ajaxStatusScript.jsf;jsessionid=1r0lz1jqrykjrpk6besg54cp5 Pesquise o ajaxStatus. Mesmo assim, vou tentar também com JSF puro. Estou curioso para ver se realmente funciona.
Responder

Gostei + 0

05/06/2013

José Junior

adaptei minha tela usando o primefaces, funcionou o busy status, só que o meu validador esta bloqueando o meu selectonemenu, eu troco a opção, ele carrega e o validador ativa e volta o selectonemenu para a primeira opção, sendo que o validador so deve ativar quando eu clicar em meu commandbutton, como posso arrumar isso ?
Responder

Gostei + 0

05/06/2013

Okabe Rintarou

[quote="juniorkun"]adaptei minha tela usando o primefaces, funcionou o busy status, só que o meu validador esta bloqueando o meu selectonemenu, eu troco a opção, ele carrega e o validador ativa e volta o selectonemenu para a primeira opção, sendo que o validador so deve ativar quando eu clicar em meu commandbutton, como posso arrumar isso ?
A priori eu não sei, teria como postar o código da página com o Primefaces e o validador?
Responder

Gostei + 0

06/06/2013

José Junior

o codigo da pagina :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<h:body>
        <p:ajaxStatus onstart="statusDialog.show();" onsuccess="statusDialog.hide();"/>
        <p:dialog modal="true" widgetVar="statusDialog" header="Carregando ..."  
            draggable="false" closable="false"
            <p:graphicImage name="progressbar.gif" library="icones"/> 
        </p:dialog>
        <h:form id="FormVenda">
            <p:panel id="panel">
                <h:panelGrid columns="3" cellpadding="5">
                    <f:metadata>
                            <f:event type="preRenderView" listener="#{VendaMain.CarregarTela}"/>
                    </f:metadata>
 
                    <h:outputLabel value="Empresas :" for="lblEmpresa" id="lblEmpresa"/>
                    <p:selectOneMenu value="#{VendaMain.empresaSelecionada}"
                                     converter="ConversorEmpresa"
                                     id="cbxEmpresa">
                        <f:selectItem itemLabel="Todos" itemValue="#"/>
                        <f:selectItems value="#{VendaMain.listaEmpresas}"
                                       var="empresas"
                                       itemValue="#"
                                       itemLabel="#{empresas.nome}"/>
                        <p:ajax process="cbxCliente" event="change" update="panel"/>
                    </p:selectOneMenu>
                    <br></br>
                    <h:outputLabel value="Clientes :" for="lblCliente" id="lblCliente"/>
                    <p:selectOneMenu value="#{VendaMain.clienteSelecionado}"
                                     converter="ConversorCliente"
                                     required="true" requiredMessage="Selecione um cliente"
                                     id="cbxCliente">
                        <f:selectItem itemLabel="Selecione um cliente" itemValue="#"/>
                        <f:selectItems value="#{VendaMain.listaClientes}"
                                       var="clientes"
                                       itemValue="#"
                                       itemLabel="#{clientes.nome}"/>
                    </p:selectOneMenu>
                    <p:message for="cbxCliente" />
                    <p:commandButton value="Vender" action="#{VendaMain.AbrirVenda}"
                                     onclick='javascript:return confirm("Deseja realmente abrir uma nova venda ?");'/>
                </h:panelGrid>
            </p:panel>
        </h:form>
        <h:outputLink value="Index.xhtml">Menu principal</h:outputLink>
    </h:body>
Responder

Gostei + 0

08/06/2013

José Junior

o que pode ser ?
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar