Fórum Campos dinâmicos em JavaEE usando JSF 2.2 #460536

08/11/2013

0

Bom dia, estou tentando fazer campos dinâmicos usando JSF 2.2, estou com dificuldade, tenho que fazer uma class, que recebe os dados via ArrayList<String>,e dai criar os campos em xhtml dinamicamente, alguém tem alguma dica, qualquer ajuda é bem vinda.
Dhiego Silva

Dhiego Silva

Responder

Post mais votado

12/11/2013

Bom dia,

Não sei se é exatamente isso que voce quer fazer, usando dinamicamente a criação de componentes de tela de acordo com o que voce definir na sua classe.

Mas se for, crie uma classe implementando ComponentSystemEventListener após isso vai pedir para criar os metodos da sua implementação, feito isso voce pode trabalhar dessa maneira:

    @Override
    public void processEvent(ComponentSystemEvent event) throws AbortProcessingException {
        HtmlPanelGrid panel = new HtmlPanelGrid();
        HtmlForm form = (HtmlForm) event.getComponent();
    
        Funcoes func = new Funcoes();

       //...seu sql
     
      while (rs.next()) {
                panel.getChildren().add(func.CriaLabel("Usuário:", "lusuario", true, false));
                panel.getChildren().add(func.CriaLabel(rs.getString("usuario"), "usuario", false, false));

             //..os tipos de componentes que voce desejar!
      }
    
     panel.setColumns(2);
      List<UIComponent> children = form.getChildren();
     children.add(panel);



Agora a minha Classe de funções onde voce vai criar os componentes (assim foi a forma que eu estruturei)

public UIComponent CriaLabel(String value, String nome, Boolean negrito, Boolean cor) {
        FacesContext fctx = FacesContext.getCurrentInstance();
        Application app = fctx.getApplication();
        HtmlOutputLabel label = (HtmlOutputLabel) app.createComponent(HtmlOutputLabel.COMPONENT_TYPE);


        //label.setId(nome);
        label.setValue(value);
        if (negrito) {
            label.setStyle("font-weight: bold;");
        }

        if (cor) {
            label.setStyle(label.getStyle() + "color: #B22222");
        }
        return label;
    }



E a chamada no seu xhtml

     <h:form prependId="true" id="tste">
                            <f:event type="javax.faces.event.PostAddToViewEvent"
                                     listener="#{visualizarPedidoHW.processEvent}" />
                        </h:form>



Dessa forma voce cria tudo por fora do seu xhtml, faz todo seu select e cria os componentes que quiser mostrar em sua tela na sua classe.

Mas acho que seria melhor voce usar no seu xhtml a tag <ui:repeat /> dentro de um <h:form /> e controlar tudo por dentro de seu xhtml, pois vai encontrar alguns problemas como renderização de tela, ajax entre outro se usar da forma dinamica pela classe.

Tenho esses dois exemplos no meu sistema, mas estou mudando aos poucos para trabalhar tudo diretamente com xhtml.

Espero ter ajudado!

Josivan Laskoski

Josivan Laskoski
Responder

Gostei + 1

Mais Posts

08/11/2013

Eduardo Pessoa

ja iniciou algo, tem codigo?
Responder

Gostei + 0

08/11/2013

Dhiego Silva

Ainda não, já criei uma List<String> que recebe 3 string, com isso tenho que criar dinamicamente 3 HtmlOutputLabel e 3 HtmlOutputText e depois grava os dados digitado em outra List para inclusão em um Banco de Dados. mais não estou conseguindo criar o HtmlOutputLabel e o HtmlOutputText. Alguém poderia post um exemplo?
Responder

Gostei + 0

08/11/2013

Eduardo Pessoa

a sua IDE ja está tudo OK?
Responder

Gostei + 0

10/11/2013

Luciano Martins

use EL do JSF nos componentes ex: "#{meuManagedBena.aluno.nome}"
Responder

Gostei + 0

10/11/2013

Dhiego Silva

sim esta tudo configurado é funcionando, to com dificuldade na logica no bean.
Responder

Gostei + 0

12/11/2013

Dhiego Silva

Então mais eu não posso fazer o código html, tem que ser gerado na Bean... exemplo vem um dado do bd do campo nome, ele vai entra na List, ai eu tenho que gerar um label e um inputText dinamicamente na Bean é isso que eu to precisando... ta difícil de achar um exemplo.
Responder

Gostei + 0

12/11/2013

Dhiego Silva

Valew isso vai ajuda e muito.
Responder

Gostei + 0

18/11/2013

Dhiego Silva

Consegui fazer o código funciona mais estou com uma duvida, JOSIVAN LASKOSKI como faz um evento no HtmlCommandButton, já criei ele dinamicamente usando como exemplo seu código, queria fazer um evento quando ele foce apertado vai para outra dela. tem como ajudar?
Responder

Gostei + 0

18/11/2013

Josivan Laskoski

Mais uma vez vou lhe alertar, não é uma boa pratica o desenvolvimento em Bean de componentes de tela, como lhe falei, estou mudando o pouco que tenho para trabalhar dentro da view.
O botão é melhor que voce crie ele dentro da view, vai evitar muitos problemas e estará fazendo uma boa pratica de desenvolvimento.

Mas segue um exemplo:

botao.addActionListener(new ActionListener() {  
    @Override public void processAction(ActionEvent e) {  
        FacesContext fctx = FacesContext.getCurrentInstance();  
        ELContext elctx = fctx.getELContext();  
        ELResolver resolver = elctx.getELResolver();  
        MyBean mb = (MyBean) resolver.getValue(elctx, null, "");  
        mb.doSomething();  
    }  
});  
Responder

Gostei + 0

18/11/2013

Dhiego Silva

tentei mais não esta funcionado, no lugar do Mybean eu coloquei o nome da minha bean, dai criei um função com retorno com o nome da pagina que eu quero mais não ta dando, segue o código.

#Código
# Classe Funcoes

//Gerando campo Button
	public UIComponent CriaButton(String value, String nome) {
	
	FacesContext fctx = FacesContext.getCurrentInstance();
	Application app = fctx.getApplication();
	HtmlCommandButton button = (HtmlCommandButton) app.createComponent(HtmlCommandButton.COMPONENT_TYPE);		
	
	button.setValue(value);		
		
	button.addActionListener(new ActionListener() {  
	    @Override public void processAction(ActionEvent e) {  
	        FacesContext fctx = FacesContext.getCurrentInstance();  
	        ELContext elctx = fctx.getELContext();  
	        ELResolver resolver = elctx.getELResolver();  
	        VisualizarPedidoHW mb = (VisualizarPedidoHW) resolver.getValue(elctx, null, "{VisualizarPedidoHW.processar()}");  
	        mb.processar();  
	    }  
	});  
	
	return button;

	}




# Classe VisualizarPedidoHW

	public String processar(){
		return "novo";
	}
Responder

Gostei + 0

21/01/2015

Matheus Santos

Gostaria de saber se alguém conseguiu resolver o problema e se possível mandar o código de exemplo
Responder

Gostei + 0

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

Aceitar