De que se trata o artigo:

Uso da biblioteca Beans Binding para implementação do padrão Presentation Model em interfaces Swing para aplicações Java e como o uso desta técnica permite construir interfaces desktop para sistemas Java de forma simples e produtiva.


Para que serve:

Fornecer um meio para implementar clientes desktop ricos capazes de intercambiar dados automaticamente entre a interface e o modelo de negócio. Permite também controlar o comportamento de uma tela apenas trabalhando com um modelo de apresentação simples e reutilizável, sem a necessidade de manipulação direta de componentes gráficos.

Em que situação o tema é útil:

Ao analisar as alternativas de interfaces para clientes ricos de sistemas corporativos, pois é importante considerar os benefícios da utilização de interfaces Swing e as tecnologias que facilitam o desenvolvimento e implantação como o Beans Binding e o Java Webstart.

Swing + Beans Binding:

O binding (ou vinculação) de propriedades de objetos simples a propriedades de componentes gráficos do Swing permite construir interfaces que trocam dados automaticamente entre a interface gráfica e as entidades de um sistema. Também permite implementar de forma simples o padrão Presentation Model, através do qual é possível controlar o comportamento das telas apenas trabalhando com um modelo de apresentação simples e reutilizável, sem a necessidade de manipulação direta de componentes gráficos.

Este artigo apresenta a API de Beans Binding e como seu uso é integrado com o Swing GUI Builder do NetBeans 6.5 (anteriormente conhecido como Matisse). Veremos como a API de binding consegue sincronizar as propriedades de diferentes objetos e particularmente de componentes gráficos do Swing. Finalmente, será explicado como esta API pode ser usada como ferramenta facilitadora para implementação do padrão de projeto chamado de Presentation Model.

Java no desktop?

Esta pergunta talvez ainda seja feita pelos desenvolvedores mais experientes. Na realidade, quem conviveu com os primeiros anos do Java tem todo o direito de questionar a viabilidade deste tipo de aplicação. O Swing trouxe componentes gráficos elegantes baseados num modelo MVC, mas não tão simples de trabalhar. Os gerenciadores de layouts, apesar de eficientes, não tinham a agilidade de ambientes WYSIWYG para prototipação rápida de telas.

Porém, com o tempo a situação mudou bastante. A plataforma e as IDEs evoluíram. Hoje, com as novas ferramentas e com o Java Webstart para distribuição automatizada, uma interface desktop para aplicações corporativas é uma alternativa às interfaces Web não apenas viável, mas também muito produtiva e eficiente.

O recente lançamento JavaFX é o último avanço nesta escalada, mas ainda é uma tecnologia em processo de amadurecimento que aos poucos vai ganhar suporte mais completo das IDEs. Uma das features interessantes da JavaFX foi o suporte nativo ao binding de propriedades (ou “vinculação”, em tradução livre)[1]. Porém, fora da JavaFX também é possível implementar a vinculação de propriedades entre dois objetos, e esta é uma das ferramentas mais interessantes para acelerar o desenvolvimento de aplicações desktop. Neste artigo vamos demonstrar como a biblioteca BeansBinding implementa esse processo e como utilizá-lo de forma produtiva através do suporte oferecido pelo NetBeans 6.5.

Beans Binding

Manter duas propriedades de dois objetos em sincronia é mais complicado do que parece, principalmente se isso deve ser encapsulado em uma API com baixo nível de intrusão no código de negócio.

De forma rápida e crua, é possível vincular a propriedade de dois objetos como na forma usada na Listagem 1. Após este trecho de código, o texto “Zé” é impresso. Enquanto o binding estiver ativo, qualquer alteração na propriedade nome do objeto c1 é automaticamente refletida em c2 (e vice-versa). A API Beans Binding é baseada nas especificações de propriedades JavaBeans e na capacidade de instalar escutadores de estados nos objetos a serem sincronizados.

Listagem 1. Uso manual do BeansBinding


  Contato c1 = new Contato();
  Contato c2 = new Contato();
  Binding binding = Bindings.bind(UpdateStrategy.READ_WRITE, c1,
  BeanPropery.create("nome"), c2, BeanProperty.create("nome"));
  Binding.bind();
  c1.setNome("Zé");
  System.out.println(c2.getNome());

Porém, esta automação exige que a classe Contato respeite o contrato de definição de propriedades e publicação de eventos da especificação JavaBeans. De forma mais objetiva, o Beans Binding exige que a classe implemente os padrões setters e getters de nomeação para encapsular propriedades, e a disponibilização dos métodos addPropertyChangeListener() e removePropertyChangeListener(). Essas exigências podem ser observadas na ...

Quer ler esse conteúdo completo? Tenha acesso completo