Binding

10 Messages Forum Options Options
Permalink
jcomp
Binding
Reply Threaded More
Print post
Permalink
Estou desenvolvendo um projeto e vou utilizar a API Binding, porém por exigências desse projeto, o ideal seria que não utilizasse o presentation model.
Tenho as classes:

-> Operador (Classe Bean, com os atributos nome, endereco, login, senha...)
-> OperadorForm(Classe responsável pelos formularios de cadastro, exclusao, alteração e consulta de um operador. Estou utilizando o JGoodies Forms).

Agora preciso juntar os atributos da classe Operador aos respectivos componentes do OperadorForm. Qual é a melhor maneira de fazer isso?

Grato!
Hugo Teixeira
Re: Binding
Reply Threaded More
Print post
Permalink
Você deve utilizar objetos da interface ValueModel (implementação ValueHolder) para campos que possuem um único valor (nome, endereço, login, senha) e objetos da interface ListModel para campos que possuem listas de objetos (JComboboxes, JTables, JLists).

Eu tenho um artigo sobre essa parte do bindings aqui:
http://www.componenthouse.com/article-14
Vale a pena dar uma olhada.

Abraços,
Hugo Teixeira.
jcomp
Re: Binding
Reply Threaded More
Print post
Permalink
Ok... Dei uma olhada no artigo, mas a dúvida ainda segue:

--> Classe Operador (ATRIBUTOS)
--> Classe OperadorForm (Componentes).

Agora estou fazendo uma outra classe chamada OperadorBinding para fazer o bind dos atributos aos componentes.

public void conectaOperadorForm(){
               //O JTextField já existe na classe OperadorForm
                ValueModel valueModel = new ValueHolder();
                Bindings.bind( ? , valueModel); //A dúvida é exatamente aki *
        }

* Sei que preciso colocar o JTextField no ?, mas para isso será preciso fazer uma instância da classe. Outro ponto, na classe OperadorForm, vou precisar ter um get() para cada componente. Essa forma tá correta? Senão, o q faço?

Muito Grato!
Hugo Teixeira
Re: Binding
Reply Threaded More
Print post
Permalink
jcomp wrote:
* Sei que preciso colocar o JTextField no ?, mas para isso será preciso fazer uma instância da classe.
Fazer uma instância de que classe?
jcomp wrote:
Outro ponto, na classe OperadorForm, vou precisar ter um get() para cada componente. Essa forma tá correta? Senão, o q faço?
Não está correto não.
Você precisa ter duas classes:

OperadorBind (eu chamaria de OperadorPresentationModel):
Nessa classe você declara todos os ValueModels e ListModels e cria metodos get (getters) para cada um desses modelos.

OperadorForm (eu chamaria de OperadorView)
Nessa classe você monta o painel criando os componentes e amarrando-os aos modelos do OperadorBind acima. Exemplo:

    JTextField textField = new JTextField();
    Bindings.bind(textField, operadorBind.getNomeHolder());

Na classe OperadorBind:

    private ValueHolder nomeHolder = new ValueHolder();
    public ValueModel getNomeHolder() { return nomeHolder; }

Entendeu?
jcomp
Re: Binding
Reply Threaded More
Print post
Permalink
Ok, entendi sim, eu tava fazendo totalmente ao contrário. Só mais uma dúvida: Na classe OperadorForm (OperadorView), vou precisar chamar o método getHolderName();:

Classe OperadorForm
painel.add(BasicComponentFactory.createTextField(OperadorNegocio.getHolderName()), cc.xyw(4, 4, 5)); //nome - não compila ainda

Vc me aconselha a fazer uma instância da classe OperadorNegocio (OperadorPresentationModel) na classe OperadorForm, ou eu faço os métodos da classe OperadorNegócio estáticos, para poder chamá-los diretamente no OperadorForm?

Mais uma vez, mto obrigado!
Hugo Teixeira
Re: Binding
Reply Threaded More
Print post
Permalink
jcomp wrote:
Vc me aconselha a fazer uma instância da classe OperadorNegocio (OperadorPresentationModel) na classe OperadorForm, ou eu faço os métodos da classe OperadorNegócio estáticos, para poder chamá-los diretamente no OperadorForm?
Na verdade, o ideal é receber a instância no construtor da view.
Exemplo:

    public OperadorForm(OperadorPresentationModel pm) {
        this.pm = pm;
    }


Aí você utiliza a variavel "pm" na hora de criar os componentes:

    painel.add(BasicComponentFactory.createTextField(pm.getHolderName()), cc.xyw(4, 4, 5));

Esse é o jeito mais indicado para montar as telas
jcomp
Re: Binding
Reply Threaded More
Print post
Permalink
Olá Hugo, fiz dessa forma sim e deu certo! Mto obrigado!
Porém surgiu uma outra dúvida a respeito do BeanAdapter. Dei uma olhada no artigo q me sugeriu (q por sinal ficou mto bom).
Esse BeanAdapter é para 'escutar' modificações em um determinado componente certo?
Então por exemplo, quando eu estiver cadastrando um funcionário existe a necessidade de um BeanAdapter?
Até pq vou jogar os dados cadastrados em uma tabela de banco de dados.
Para consultar tb é a mesma coisa, vou extrair os dados da base de dados. E para alterar ou excluir a mesma coisa, vai ficar td na base de dados.

Sendo assim, não preciso do BeanAdapter, certo? ou errado? fiquei super confuso agora, em relação a isso. Muito Grato!
Hugo Teixeira
Re: Binding
Reply Threaded More
Print post
Permalink
O BeanAdapter é uma classe opcional que apenas facilita algumas coisas.
Não é sempre que temos que usá-la.
Eu mesmo não precisei utilizar essa classe no meu exemplo da JTable:
http://www.nabble.com/Re%3A-Como-fazer-Binding-em-JTable--p12800020.html

Portanto, fique tranquilo e tente fazer sem essa classe mesmo.
jcomp
Re: Binding
Reply Threaded More
Print post
Permalink
Ok, mas se eu não usar o BeanAdapter e modificar um atributo que está amarrado a um componente, através do seu ValueModel, este sofrerá a alteração ou não?
Hugo Teixeira
Re: Binding
Reply Threaded More
Print post
Permalink
Se o atributo está amarrado ao componente através de um ValueModel, então com certeza um atualiza o outro:
- Se você modificar o valor do atributo, o componente será atualizado também;
- Se você editar o valor do componente, o atributo será editado também;