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;
}
}
ibira
Junho 11, 2010, 2:50pm
#2
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
vi-gb
Junho 14, 2010, 3:52pm
#5
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
vi-gb
Junho 15, 2010, 1:06pm
#8
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
vi-gb
Junho 16, 2010, 8:16am
#10
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?
vi-gb
Junho 16, 2010, 9:06am
#13
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
vi-gb
Junho 16, 2010, 9:34am
#15
É 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
vi-gb
Junho 16, 2010, 11:15am
#17
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
vi-gb
Junho 16, 2010, 11:58am
#19
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