Como criar componentes do jsf dinamico -RESOLVIDO

Ola pessoas , estou com um problema aqui, gostaria de construir um SelectOneMenu com o SelectItens e um InputText DINAMICAMENTE.
Bom eu até consegui criar exibir na tela renderizado e tals , estou usando setValue para associa com o atributo do meu bean, porem não esta funcionando, alguem poderia me dar uma ajuda, segue meu cogigo abaixo.

        private void criarComponentes() {

        this.setPainel(new HtmlPanelGrid());
        this.getPainel().setColumns(2);

        HtmlOutputText hotTitulo = (HtmlOutputText) FacesContext.getCurrentInstance().getApplication().createComponent(HtmlOutputText.COMPONENT_TYPE);

        hotTitulo.setValue("Configuração do Relatório de Pessoas");
        Integer posicao = 0;
      

        for (Field field : this.getClassePessoa().getDeclaredFields()) {
            HtmlSelectOneMenu somOperadores = (HtmlSelectOneMenu) FacesContext.getCurrentInstance().getApplication().createComponent(HtmlSelectOneMenu.COMPONENT_TYPE);
            UISelectItems sim = (UISelectItems) FacesContext.getCurrentInstance().getApplication().createComponent(UISelectItems.COMPONENT_TYPE);
            this.getOperadoresSelecionados().add(new String());
            somOperadores.setValue(this.getOperadoresSelecionados().get(posicao));
            sim.setValue(this.getOperadores());
            somOperadores.getChildren().add(sim);

            HtmlInputText itxOperador = (HtmlInputText)FacesContext.getCurrentInstance().getApplication().createComponent(HtmlInputText.COMPONENT_TYPE);
            this.getValoresFiltro().add(new String());
            itxOperador.setValue(this.getValoresFiltro().get(posicao));

            this.getPainel().getChildren().add(somOperadores);
            this.getPainel().getChildren().add(itxOperador);
            posicao = posicao + 1;

        }


    }

Uso aqui a construção dinamica de componentes em JSF - Richfaces

Porém, não uso o FacesContextr para cria e sim como objeto mesmo e no fim adiciona na lista de componentes do panel.

HtmlSelectOneMenu som = new HtmlSelectOneMenu(); por exemplo…

E para buscar o valor pego com o valueexpression dele, pra mim fica mais fácil…
som.setValueExpresion(“value”, );

ibira, primeiramente quero agradecer por estar ajudando aqui, bom vamos la

"Porém, não uso o FacesContextr para cria e sim como objeto mesmo e no fim adiciona na lista de componentes do panel.

HtmlSelectOneMenu som = new HtmlSelectOneMenu(); por exemplo… "

Beleza vou mudar o meu tbm,

então é a propriedade setValue mesmo para atribuir o atributo do bean?

blz se for ela é so eu acessar o atributo do meu bean que ela vai estar com o valor?

para que usar valueExpression , ou melhor voce poderia me explicar para queserve o valueExpression, pois tem muito pouco mateira na net sobre isso

Pessoal mais alguem podereria me ajudar aqui? é Urgente

Não entendo muito disso mas parece que neste topico tem a resposta para a sua pergunta.

http://forums.sun.com/thread.jspa?threadID=5272442

Espero que te ajude.

Então eu não estou conseguindo usar o ExpressionValue, não esta tando certo

    FacesContext context =FacesContext.getCurrentInstance();
    ELContext elContext = context.getELContext();
    Application app = context.getApplication();
    ExpressionFactory expressionFactory = app.getExpressionFactory();

    ValueExpression ve = expressionFactory.createValueExpression(elContext, "#{mbPessoa.testeFiltro}", String.class);


    HtmlInputText  itxOperador = new HtmlInputText();
    itxOperador.setValueExpression("e", ve);

Estou fazendo com inputText bem simples soh para ver se funciona, mais não esta funcionando

alguem sabe porque?

Pessoal não estou conseguindo mesmo coloquei, criei este tópico 6ªfeira 11/06/2010, mais ja fora 5 dias e não consegui resolver, alguem por favor poderia me ajugar,agradeço a todos que estão me ajudando

Posta como esta seu bean e sua pagina pra eu ver.

Meu bean

public class MbPessoa {

    private Class classePessoa;
    private Pessoa pessoa;
    private HtmlForm formulario;
    private HtmlPanelGrid painel;
    private HtmlPanelGrid painelPrincipal;
    private List<String> pessoas;
    private List<String> pessoasSelecionadas;
    private List<String> operadores;
    private List<String> operadoresSelecionados;
    private List<String> valoresFiltro;
    private String filtroTeste;
    private HtmlInputText itxOperador;

    public MbPessoa() {
        try {
            this.setClassePessoa(Class.forName("dominio.Pessoa"));
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(MbPessoa.class.getName()).log(Level.SEVERE, null, ex);
        }
        this.setPessoasSelecionadas(new ArrayList<String>());
        this.setOperadoresSelecionados(new ArrayList<String>());
        this.setValoresFiltro(new ArrayList<String>());
        this.setPessoa(new Pessoa());
        this.criarComponentes();

    }

    private void criarComponentes() {

        this.setPainel(new HtmlPanelGrid());
        this.getPainel().setColumns(2);

        HtmlOutputText hotTitulo = (HtmlOutputText)    FacesContext.getCurrentInstance().getApplication().createComponent(HtmlOutputText.COMPONENT_TYPE);

        hotTitulo.setValue("Configuração do Relatório de Pessoas");
      
        FacesContext context = FacesContext.getCurrentInstance();
        ELContext elContext = context.getELContext();
        Application app = context.getApplication();
        ExpressionFactory expressionFactory = app.getExpressionFactory();


        ValueExpression ve = expressionFactory.createValueExpression("#{mbPessoa.filtroTeste}", String.class);

        //ValueBinding vb = app.createValueBinding("#{filtroTeste}");

        itxOperador = new HtmlInputText();
        //vb.setValue(context, vb.getValue(context));

        itxOperador.setValueExpression("e", ve);
        //itxOperador.setValueBinding("e", vb);
        this.getPainel().getChildren().add(itxOperador);
    }
}

Agora meu jsf


<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>Configurar Relatório de Pessoas</title>
    </h:head>
    <h:body>
        <h:form binding="#{mbPessoa.formulario}">
            <h:panelGrid columns="2">
                <h:selectManyCheckbox id="listaPessoasSelecionadas" value="#{mbPessoa.pessoasSelecionadas}"  layout="pageDirection">
                    <f:selectItems itemValue="#{pes}" var="pes" value="#{mbPessoa.pessoas}" />
                </h:selectManyCheckbox>
                <h:panelGrid binding="#{mbPessoa.painel}" columns="2">
                </h:panelGrid>
            </h:panelGrid>
        </h:form>
    </h:body>
</html>

Bom pessoal queria tambem complementar, se eu criar o componente com o ExpressionValue do jeito que estou criando e criar o mesmo componente na tela e usar o binding, ai vai funcionar, mais o problema é que eu não sei quantos componentes eu vou criar, pois vai ser determinado por outro fator então tenho que criar todos esse componentes no codigo java dinamico.

Obrigado

Acho que esta faltando o metodo get e set do painel para que a pagina consiga acessa-lo nao é?

vi gb , muito obrigado por ajudar, então é que não postei os gets e sets, mais segue aki abaixo, estão todos completos

public HtmlInputText getItxOperador() {
return itxOperador;
}

public void setItxOperador(HtmlInputText itxOperador) {
    this.itxOperador = itxOperador;
}

public String getFiltroTeste() {
    return filtroTeste;
}

public void setFiltroTeste(String filtroTeste) {
    this.filtroTeste = filtroTeste;
}

public List<String> getOperadoresSelecionados() {
    return operadoresSelecionados;
}

public void setOperadoresSelecionados(List<String> operadoresSelecionados) {
    this.operadoresSelecionados = operadoresSelecionados;
}

public List<String> getValoresFiltro() {
    return valoresFiltro;
}

public void setValoresFiltro(List<String> valoresFiltro) {
    this.valoresFiltro = valoresFiltro;
}

public List<String> getOperadores() {
    return operadores;
}

public void setOperadores(List<String> operadores) {
    this.operadores = operadores;
}

public List<String> getPessoas() {
    return pessoas;
}

public void setPessoas(List<String> pessoas) {
    this.pessoas = pessoas;
}

public List<String> getPessoasSelecionadas() {
    return pessoasSelecionadas;
}

public void setPessoasSelecionadas(List<String> pessoasSelecionadas) {
    this.pessoasSelecionadas = pessoasSelecionadas;
}

public HtmlPanelGrid getPainel() {
    return painel;
}

public void setPainel(HtmlPanelGrid painel) {
    this.painel = painel;
}

public HtmlForm getFormulario() {
    return formulario;
}

public void setFormulario(HtmlForm formulario) {
    this.formulario = formulario;
}

public Pessoa getPessoa() {
    return pessoa;
}

public void setPessoa(Pessoa pessoa) {
    this.pessoa = pessoa;
}

public Class getClassePessoa() {
    return classePessoa;
}

public void setClassePessoa(Class classePessoa) {
    this.classePessoa = classePessoa;
}

public HtmlPanelGrid getPainelPrincipal() {
    return painelPrincipal;
}

public void setPainelPrincipal(HtmlPanelGrid painelPrincipal) {
    this.painelPrincipal = painelPrincipal;
}

acho que não seria isto o porblema eu acho que o problema está mais relacionado ao que eu falei,

Se eu colocar este InputText na tela e ligar ele pelo binding com o input do meu mbPessoa,ai funciona, porem não quero fazer isto, ai gera minha duvida

Tem algum jeito de fazer o biding no java? ou melhor tem outra forma de fazer isto funcionar?

Ola, qual a mensagem de erro que aparece? Rodei aqui e o inputtext aparece normal. Me explique melhor como deveria funcionar a pagina.

Então não aparece erro nenhum ele apenas não passa o valor que você digitar no atributo do bean no caso o “filtroTeste”
se vc tentar acessar este atributo ele vai estar null

É pq em momento nenhum vc da um submit, vc nao tem um botao para enviar esta informacao, e nem definiiu um evento (onkeyup, onkeypress, etc) com uma ação (reRender por exemplo) entende?

Vou tentar montar um exemplo aqui e depois envio.
Se voce utiliza richfaces, da uma pesquisada no a4j:support com ele vc define eventos e acoes para um componente.
Caso contrario da uma pesquisada sobre eventos javasccript tipo onkeyup e como dar submit por ele.

então na verdade eu tenho este botão

<h:commandButton value=“Gera relatorio”
actionListener="#{mbPessoa.gerarRelatorio}" />

que chama o metodo gerarRelatorio ai neste metodo eu dou um System.out.println no atributo, mais ele esta null , é que não postei ele para não ficar muito codigo, desculpe me,

por ser so um exemplo estou usando apenas jsf

quero agradecer por estar me ajudando

Obrigado

Tenta mudar esta linha pra ver se vai:

itxOperador.setValueExpression("value", ve);

era ‘e’ e eu coloquei ‘value’, veja se funciona

troquei pra value, mesmo assim não funcionou, você chegou testar ai?

Obrigado

Testei sim, q estranho veja o metodo como esta:

[code]
private void criarComponentes() {

	this.setPainel(new HtmlPanelGrid());
	this.getPainel().setColumns(2);

	HtmlOutputText hotTitulo = (HtmlOutputText) FacesContext
			.getCurrentInstance().getApplication().createComponent(
					HtmlOutputText.COMPONENT_TYPE);

	hotTitulo.setValue("Configuração do Relatório de Pessoas");

	FacesContext context = FacesContext.getCurrentInstance();
	ELContext elContext = context.getELContext();
	Application app = context.getApplication();
	ExpressionFactory expressionFactory = app.getExpressionFactory();

	ValueExpression ve = expressionFactory.createValueExpression(elContext,
			"#{mbPessoa.filtroTeste}", String.class);

	itxOperador = new HtmlInputText();

	itxOperador.setValueExpression("value", ve);
	this.getPainel().getChildren().add(itxOperador);
}[/code]

ENTÃO, teste aki e não funciona, tbm pq mudar pra value?
O engraçado e que se eu criar o componente na tela e usar o binding ai ele funciona