RichFaces Chamada de Méotdo

13 respostas
T

Olá estou com uma dúvida, eu adicionei um comboBox na tela e queria que sempre que fosse mudando o campo selecionado ele chamasse um método. Eu pensei em chamar o método direto no onChange do combo, mas ele aceita passagem de parametros e não chamada de metodos.

Para métodos é usada a tag a4j “http://richfaces.org/a4j”, só que todo exemplo que eu encontro usa o re-Render, e na verdade o que eu quero é que ele chame um método na classe java já mapeada, para fazer verificações do texto selecionado no ComboBox e a partir daí realizar alguma função, dependendo do valor.

Se alguém souber uma apostila ou livro para iniciante, eu agradeço também.

13 Respostas

alias

Talita_a:
Olá estou com uma dúvida, eu adicionei um comboBox na tela e queria que sempre que fosse mudando o campo selecionado ele chamasse um método. Eu pensei em chamar o método direto no onChange do combo, mas ele aceita passagem de parametros e não chamada de metodos.

Para métodos é usada a tag a4j “http://richfaces.org/a4j”, só que todo exemplo que eu encontro usa o re-Render, e na verdade o que eu quero é que ele chame um método na classe java já mapeada, para fazer verificações do texto selecionado no ComboBox e a partir daí realizar alguma função, dependendo do valor.

Se alguém souber uma apostila ou livro para iniciante, eu agradeço também.

Olá,

O seu combo é do proprio JSF ou o do RichFaces?
A combo do RichFaces possui a propriedade “valueChangeListener”, onde voce pode chamar o seu método que será executado sempre que o valor da combo for alterado. A combo do JSF tambem possui essa propriedade.

Outra forma que voce pode fazer é, dentro da tag da sua compo, usar o a4j:support, para chamar o metodo quando ocorrer o evento change:

<rich:comboBox> ou <h:selectOneMenu>
   <a4j:support event="onchange" action="#{suaclasse.seumetodo}" reRender"algum-componente-que-queira-atualizar" />
</rich:comboBox> ou </h:selectOneMenu>
T

O “valueChangeListener”, eu posso chamar direto um metodo da minha classe java?

No caso de usar o exemplo abaixo:

<a4j:support event=“onchange” action="#{suaclasse.seumetodo}" reRender"algum-componente-que-queira-atualizar" />

eu posso só usar o método, e não colocar nada no reRender? E no meu método, eu bloquearia algum textBox da tela por exemplo.

Obrigada pela ajuda.

Z

Olá tudo bem,

Bem, pelo que eu entendi vc gostaria de chamar um método ao realizar o evento onchange e desabilitar ou deixar readonly um campo texto, vc pode fazer isso via bean colocando um atributo no seu textBox.

<h:inputText readonly="#{seubean.algumAtributoBoleano}"> ou <h:inputText disabled="#{seubean.algumAtributoBoleano}">

So que para ele fica desse modo, vc precisa dar um refresh na página ou utilizar o reRender para renderizar ele do modo que deseja.

qqr coisa posta ai

alias

Talita_a:
O “valueChangeListener”, eu posso chamar direto um metodo da minha classe java?

No caso de usar o exemplo abaixo:

<a4j:support event=“onchange” action="#{suaclasse.seumetodo}" reRender"algum-componente-que-queira-atualizar" />

eu posso só usar o método, e não colocar nada no reRender? E no meu método, eu bloquearia algum textBox da tela por exemplo.

Obrigada pela ajuda.

Sim, para as duas perguntas.

O valueChangeListener serve justamente para isso, para invocar um metodo do seu managed-bean sempre que o valor do componente for alterado. Vai ficar algo como:

<rich:comboBox valueChangeListener="#{suaclasse.seumetodo}">
</rich:comboBox>

A mesma coisa caso voce esteja usando o h:selectOneMenu

Quanto ao a4j:support, coloquei o reRender pra ilustrar, mas ele nao é obrigatorio nao.

T

Obrigada alias e Zabimaru, estou entendo como funciona a chamada de metodo agora.
Só uma dúvida o reRender serve apenas para redenrizar um componente ou funciona para toda a pagina.

Obrigada pela ajuda.

alias

Talita_a:
Obrigada alias e Zabimaru, estou entendo como funciona a chamada de metodo agora.
Só uma dúvida o reRender serve apenas para redenrizar um componente ou funciona para toda a pagina.

Obrigada pela ajuda.

Por nada. Caso funcione aí com essas dicas coloca um RESOLVIDO no titulo do topico, para outros que porventura tenham o mesmo problema nao perderem tempo :wink:

Quanto à pergunta, o reRender serve APENAS para o componente que voce especificar lá. Por exemplo, voce criou na sua pagina um <h:inputText> e informou pra ele o id “teste” (<h:inputText id=“teste”> ), entao voce vai passar no reRender o id desse componente (<a4j:algumacoisa reRender=“teste”> ). Apenas ele será renderizado novamente

E caso queira renderizar varios componentes (mas nao a pagina toda), pode usar o reRender tambem, apenas separe os ids por virgulas (<a4j:algumacoisa reRender=“componente1, componente2, componente3…”> )

T

Olá…

Adicionei ao meu comboBox o evento:

<rich:comboBox valueChangeListener="#{cadastroInicial.teste}"
defaultLabel=“Escolha o Sexo”>

E na classe cadastroInicial coloquei:

public void teste()

{

JOptionPane.showMessageDialog(null, TESTE);

System.out.println(OK);
}

Mas num acontece nada, eu tenho q adicionar algum listner para que a ação aconteça. Ou algum post back? Pq não faz nada na tela.

Obrigada pela ajuda.

T

o meu comboBox está configurado assim

<rich:comboBox defaultLabel=“Escolha o Tipo”
enableManualInput=“false”
valueChangeListener="#{cadastroInicial.teste}">
<f:selectItem itemValue=“Médico”/>
<f:selectItem itemValue=“Atendente”/>
<f:selectItem itemValue=“Ortopedia Tecnica”/>
<f:selectItem itemValue=“Clinica de Fisioterapia”/>
</rich:comboBox>

Gostaria de saber se por eu estar definindo os nomes no ItemValue, é por isso que o valueChangeListener não funciona. Tendo que usar o value mesmo e fazendo referência a uma lista de nomes na minha classe basica que teria esse valores contigos em itemValue.

Obrigada pela ajuda

alias

Hum…creio que me esqueci de um detalhe e peço desculpas.

O seu metodo “teste” (o metodo que voce vai colocar valueChangeListener), deve ter retorno void, como está, e ter como parametro javax.faces.event.ValueChangeEvent

Entao ficaria aí…

public void teste(javax.faces.event.ValueChangeEvent event){
   ....
}

Está na especificação do componente (docs do RichFaces) que esse metodo deve seguir essa estrutura…talvez tenha sido isso, teste aí…ou corra para o a4j:support :slight_smile:

T

Olá, alterei o método teste, e adicionei um parametro para o value do comboBox, por que li que esse método valueChangeListner verifica se o valor do combo foi alterado. Mas mesmo assim não funciona.

Ele está populando o comboBoc corretamente, com os valores que eu passei nesse List: cadastroInicial.selectItems.

Segue abaixo o comboBox,e depois o método teste.

<rich:comboBox defaultLabel=“Escolha o Tipo”
enableManualInput=“false”
value="#{cadastroInicial.selectedItem}"
valueChangeListener="#{cadastroInicial.teste}">

<f:selectItems value="#{cadastroInicial.selectItems}" />
   		</rich:comboBox>
public void teste(ValueChangeEvent event)

{

System.out.println(OK);

JOptionPane.showMessageDialog(null, TESTE);

this.processValueChange(null);
}

Continuo agradecendo o interesse. :smiley:

alias

Poxa…minhas dicas nao funcionam :cry: :lol:

Fiz isso aqui e funcionou, testei agora…dá uma olhada:

<h:form>
    <rich:comboBox value="#{teste.value}">
         <f:selectItems value="#{teste.list}"/>
				
        <a4j:support event="onselect" action="#{teste.testeSelect}" > </a4j:support>
    </rich:comboBox>		
</h:form>

e na classe…

public class Teste {

                private List<SelectItem> list; 
	private String value;
	
	public Teste(){
		
		list = new ArrayList<SelectItem>();
		
		for (int i = 1; i <= 10; i++){
			list.add(new SelectItem(i, "Teste " + i) );
		}
		
	}

	public String getValue() {
		return value;
	}

	public void setValue(String value) {
		this.value = value;
	}

	public List<SelectItem> getList() {
		return list;
	}

	public void setList(List<SelectItem> list) {
		this.list = list;
	}
	
	public void testeSelect(){
		System.out.println(value);
	}
	
}

Quando a execução chega no metodo testeSelect() a variavel value já está atualizada com o valor que voce informou no combo

Aqui funcionou… :stuck_out_tongue:

T

Poxa funcionou sim, muito obrigada de verdade ^^

E obrigada por todas as tentativas anteriores.

muldon

quais versoes dos frameworks vc utilizou ? Tenho o mesmo problema mas aqui nao chama o evento …

Criado 10 de setembro de 2009
Ultima resposta 22 de set. de 2010
Respostas 13
Participantes 4