Ações no Framework Genesis sem usar botões

Olá pessoal.

Estou usando Genesis para desenvolvimento de um programa em desktop.
Verifiquei como é realmente fácil invocar um método a partir de um botão, apenas colocando o nome do método anotado na classe que utilizo como form na propriedade “name” do botão da minha GUI e assim prencher os campos que estão na tela (supondo que estivesse fazendo o select de um registro numa tabela do BD).

Agora o problema é: Como eu faria para popular tabelas ou combos, ou ainda , preencher os campos de dados na GUI a partir de um outro evento que não seja o clicar de um botão. Por exemplo, suponha que eu tenha na tela um campo para pesquisa chamado código do produto e tivesse mais outros campos com outros detalhes do produto. Daí, então, eu colocaria o código do produto no campo apropriado e no momento em que tal campo perder o foco (com um TAB, ou com o clique do mouse em outro lugar) o método de pesquisa fosse chamado e então os campos correspondentes aos detalhes de tal produto fosse populado.

Estou com grande dificuldade para fazer isto, mesmo usando um exemplo como aquele citado na documentação do Genesis :

[color=darkred]public class ExemploInvokeFormActionView extends JFrame {
private ExemploInvokeFormActionForm form;
private SwingBinder binder;

public ExemploInvokeFormActionView() {
// lógica de inicializacao
binder = new SwingBinder(this, form = new ExemploInvokeFormActionForm());
binder.bind();
}

public void selecionaIndicesFinanceiros() throws Exception {
BigDecimal indice = //… obtem o indice a partir do input de outra
// janela, por exemplo
form.setIndice(indice);
ActionInvoker.invoke(form, “recalculaTotais”);
// Ou, da mesma forma:
// binder.invokeAction(“recalculaTotais”);
}

// …
}[/color]

No caso usei o exemplo acima como base para a minha aplicação. Na minha aplicação o método que estaria no lugar do [color=darkblue]public void selecionaIndicesFinanceiros() [/color]citado no exemplo é chamado a partir de um evento sobre o campo código do cliente quando este perde o foco.

Alguem poderia me ajudar ??

Desde já agradeço a atenção

Corrigindo: no final da exposição da minha situação eu falei código do cliente. Corrigindo: é código do produto

Thanks

Faça uso da anotação @CallWhen, https://genesis.dev.java.net/nonav/3.1-RC2/maven-site/pt-BR/quick_reference.html#@CallWhen, em conjunto com a função ‘hasChanged’.
É sempre aconselhável você fazer perguntas referentes ao genesis na lista do projeto.

[]'s

Gente , por favor.

Este é o exemplo da documentação do genesis:

[color=blue]public class ExemploInvokeFormActionView extends JFrame {
private ExemploInvokeFormActionForm form;
private SwingBinder binder;

public ExemploInvokeFormActionView() {
// lógica de inicializacao
binder = new SwingBinder(this, form = new ExemploInvokeFormActionForm());
binder.bind();
}

public void selecionaIndicesFinanceiros() throws Exception {
BigDecimal indice = //… obtem o indice a partir do input de outra
// janela, por exemplo
form.setIndice(indice);
ActionInvoker.invoke(form, “recalculaTotais”);
// Ou, da mesma forma:
// binder.invokeAction(“recalculaTotais”);
}

// …
}[/color]

e este é form:

[color=darkred]@Form
public class ExemploInvokeFormActionForm {
private BigDecimal indice;
// …

public BigDecimal getIndice() {
return indice;
}

public void setIndice(BigDecimal indice) {
this.indice = indice;
}

@Action
public void recalculaTotais() {
// logica de recálculo
}
}[/color]
Fiz um programinha seguindo o raciocínio do código acima. Porém usei os nomes das minhas classes e dos meus métodos.
No entando ao EXECUTAR o programa sempre dá o erro
[color=red]29/04/2008 18:17:53 net.java.dev.genesis.ui.binding.AbstractBinder bindActionMetadata
WARNING: mostraFunc1 could not be found while binding class forms.PanelTeste1Form[/color]

onde mostraFunc1 é a @Action do form e forms.PanelTeste1Form é a minha classe form.

como eu me livro deste erro ???

Já coloquei todas as anotações necessárias. Porém só funciona se eu chamar o método mostraFunc1 a partir de um botão na tela que tenha o nome do tal metodo. Mas eu quero chamar este metodo de outra forma e não através de um botão. Quero chamar através do evento perda de foco de um jtextfield.

Como eu faço ?

Obrigado

Primeiramente, isso não é um erro, é apenas um aviso. Para documentação sobre foco, o tutorial da Sun é bastante ilustrativo: http://java.sun.com/docs/books/tutorial/uiswing/events/focuslistener.html. Em tese, bastaria disparar a @Action dentro do evento… Entretanto acredito ter melhores formas de fazer o que você deseja.

[]'s

Na realidade , foi isto mesmo que fiz.
Tentei disparar a @Action de dentro do evento, porém ao executar o programa, a impressão que eu tenho é que ele já quer “ligar” todos os atributos e métodos do form com os elementos da view já na inicialização não encontrado, desta forma, o método que eu quero utilizar somente quando o evento acontecer. Quando nomeio um botão, com o nome do método anotado com @Action parece que ele encontra tal metodo e não emite o tal aviso. Se eu tentar executar o mesmo método de outra forma dá este probleminha já citado.
Olhando para a documentação do Genesis (no exemplo que colocquei num dos meus posts) parecia ser tão fácil de fazer isto.
Alguém que já usou este framework , não teria um exemplo bem simples com uma view e um form, através do qual eu pudesse ver como realizar isto. Por exemplo, uma tela com uma campo código e um campo descrição. Daí, o usuário digitaria o valor do codigo no campo e ao tirar o foco, o campo descrição exibe alguma mensagem, talvez até o próprio código inserido pelo usuário.

Mais uma vez, obrigado.

Consguiu resolver?

Estou fazendo alguns testes para ver o funcionamento do genesis e tambem estou tendo o mesmo problema.

WARNING: message could not be found while binding class genesishelloword.MyForm
WARNING: displayMessage could not be found while binding class genesishelloword.MyForm

[quote=claudsan]Consguiu resolver?

Estou fazendo alguns testes para ver o funcionamento do genesis e tambem estou tendo o mesmo problema.

WARNING: message could not be found while binding class genesishelloword.MyForm WARNING: displayMessage could not be found while binding class genesishelloword.MyForm [/quote]

Você tem um componente com name message e outro com name displayMessage? Setou a propriedade antes de fazer binding? Se sim, poste seu código que faremos o possível pra ajudá-lo.

Não tinha percebido que era a propriedade name, que deveria ter o nome do atributo message da classe.

Pois tinha colocado o nome do objeto como message.

        displayMessage.setText("jButton1");
        displayMessage.setName("displayMessage"); // <- 

        message.setText("jTextField1");
        message.setName("message"); // <-

Agora funcionou… :twisted:

Alguem já utilizou junto com um jProgressBar ?

Não to conseguindo setar o value dele.

[quote=claudsan]Alguem já utilizou junto com um jProgressBar ?

Não to conseguindo setar o value dele.[/quote]

Basta ter um campo int e um JProgressBar com o mesmo name. Se puder, envie código que reproduza o seu problema.

Nossa…

É so pensar simples.

Funcionou obrigado pela dica Mister.