Uma aplicação com SwingBean – Parte I

 

Esta é a primeira parte de uma série de artigos que irão tratar da criação de uma aplicação Swing com o framework SwingBean. É recomendável ter uma certa noção de XML para compreendimento do processo.

 

Introdução

Os frameworks são muito utilizados para criação de interfaces gráficas que seguem um certo padrão. Ao mesmo tempo que reduzem em grande parte o tempo de criação de formulários, por exemplo, podem limitar o desenvolvedor em certos casos onde se é necessário utilizar alguma funcionalidade não suportada pelo mesmo.

 

A aplicação a ser criada ao longo dos artigos que irão tratar do SwingBean será de um cadastro de filmes (para fugir um pouco da criação de Usuários e Clientes). O framework pode ser obtido em: http://swingbean.sourceforge.net/.

Antes de se iniciar o desenvolvimento é necessário importar as bibliotecas swingbean.jar, forms-1.0.5.jar, jcalendar.jar e validation-1.0.jar (versões utilizadas para o artigo – podem estar mais atualizadas) para o projeto.

 

Criando o bean Filme

Para dar início à criação do cadastro de filmes é necessário criar um bean representando o objeto Filme, visto que deve haver uma classe que irá conter os dados preenchidos no formulário para ser mantido durante a execução ou salvo em um banco de dados/arquivo de texto, etc.

 

A idéia é ter uma instância vazia de Filme para ser populada com os dados preenchidos, o que poupa ao desenvolvedor ter de recuperar cada campo do formulário e armazená-lo.

 

A Listagem 01 contém o bean Filme.

 

package br.com.jm.beans;

 

import java.util.Date;

 

public class Filme {

       

        private int censura;

        private Date dataDeLancamento;

        private String titulo;

        private String diretor;

        private String genero;

        private String atoresPrincipais;

        private String descricao;

       

        public Filme(){}

 

//getters e setters

 

public String toString(){

               StringBuffer sBuffer = new StringBuffer();

               sBuffer.append("Título: " + titulo + "\n");

               sBuffer.append("Diretor: " + diretor + "\n");

               sBuffer.append("Atores Principais: " + atoresPrincipais + "\n");

               sBuffer.append("Gênero: " + genero + "\n");

               sBuffer.append("Data de Lançamento: " + dataDeLancamento + "\n");

               sBuffer.append("Censura: " + censura + "\n");

               sBuffer.append("Descrição: " + descricao + "\n");

              

               return sBuffer.toString();

        }

}

Listagem 01

 

Os getters e setters foram omitidos por motivos de espaço mas devem estar definidos, visto que o framework fará uso deles para armazenar e obter os valores de cada atributo.

 

O método toString foi definido apenas para fins de testes no final do artigo.

 

O XMLDescriptor

Com o bean bem estruturado parte-se para a criação do arquivo XML chamado aqui de XMLDescriptor. Ele será responsável por manter as informações do formulário de preenchimento dos dados referentes a labels, posicionamento de campos e outras características importantes. Este arquivo será criado na pasta raiz da aplicação (para o artigo, mas pode ser armazenado em outras pastas, contanto que se especifique no momento de chamá-lo), e terá o nome filme_xmldescriptor.xml.

 

<?xml version="1.0" encoding="UTF-8"?>

<beanDescriptor>

        <line>

               <property name="titulo"  label="Título" />

               <property name="diretor" />

        </line>

        <line>

               <property name="atoresPrincipais" />

        </line>

        <line>

               <property name="genero" label="Gênero" />

               <property name="dataDeLancamento" label="Data de Nascimento" />

               <property name="censura" />

        </line>

        <line>

               <property name="descricao" label="Descrição" type="large_text" />

        </line>

</beanDescriptor>

Listagem 02

 

Como o formulário para esta primeira parte do artigo é relativamente simples, serão utilizadas poucas propriedades para configurá-lo.

 

Cada <line> ... </line> representa uma linha e todos os componentes adicionados dentro da tag serão posicionados nela. No XML acima foram definidas quatro linhas.

 

A tag <property ... > ... </property> deverá ter o name idêntico ao nome do atributo definido no bean Filme. Através do name, o framework irá armazenar o valor digitado no formulário no atributo.

 

Em apenas algumas tags property foi definido o label. Por padrão, o label do componente é o que está armazenado em name. Mas para alguns atributos só o name não basta. O “título”, por exemplo, ficaria sem o acento no “i”, e a data de nascimento ficaria “Data De Nascimento”. Nesses casos define-se label para adicionar o label desejado.

 

Uma última observação a ser destacada quanto ao XML é o atributo type, que no caso do campo descrição foi definido como “large_text”, pois nesse caso não se trata de um textfield, mas sim de uma textarea.

 

Este XML contém as informações necessárias ao framework para montar todos os dados do formulário. Parte-se então para sua criação.

 

O formulário

Será criado agora um frame que fará uso do SwingBean para montagem do formulário de cadastro de filmes.

 

package br.com.jm.forms;

 

import java.awt.BorderLayout;

import java.awt.Dimension;

 

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.UIManager;

 

import org.swingBean.actions.ApplicationAction;

import org.swingBean.descriptor.GenericFieldDescriptor;

import org.swingBean.descriptor.XMLDescriptorFactory;

import org.swingBean.gui.JActButton;

import org.swingBean.gui.JBeanPanel;

 

import br.com.jm.beans.Filme;

 

public class CadastroFilme extends JFrame{

       

        private Filme beanFilme;

       

        public CadastroFilme(){

               this.beanFilme = new Filme();

              

               super.add(getFormCadastro());

               super.setSize(new Dimension(640, 320));

               super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        }

       

        public JPanel getFormCadastro(){

               GenericFieldDescriptor descriptor = XMLDescriptorFactory.getFieldDescriptor(Filme.class, "filme_xmldescriptor.xml", "Cadastro de Filmes");

               final JBeanPanel<Filme> panelFilme = new JBeanPanel<Filme>(Filme.class, descriptor);

              

               ApplicationAction actionCadastra = new ApplicationAction(){

                       public void execute(){

                              panelFilme.populateBean(beanFilme);

                               System.out.println(beanFilme);

                               panelFilme.cleanForm();

                       }

               };

               JActButton bCadastra = new JActButton("Cadastrar", actionCadastra);

              

               ApplicationAction actionLimpa = new ApplicationAction(){

                       public void execute(){

                               panelFilme.cleanForm();

                       }

               };

               JActButton bLimpaCampos = new JActButton("Limpar campos", actionLimpa);

              

               JPanel buttons = new JPanel();

               buttons.add(bCadastra);

               buttons.add(bLimpaCampos);

              

               JPanel jPanel = new JPanel(new BorderLayout());

               jPanel.add(panelFilme, BorderLayout.NORTH);

               jPanel.add(buttons, BorderLayout.SOUTH);

              

               return jPanel;

        }

              

        public static void main(String[] args) {

               try{

                       UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

               }catch(Exception exception){}

                      

               CadastroFilme cadastroFilme = new CadastroFilme();

               cadastroFilme.setVisible(true);

        }

}

Listagem 03

 

O método getFormCadastro irá montar o formulário e o retornará para que o construtor de CadastroFilme o adicione.

 

GenericFieldDescriptor recebe a classe que representa o bean (Filme), o caminho e o nome do arquivo XML definido anteriormente e um título para o formulário.

 

Em seguida foi criado o painél montado pelo SwingBean, JBeanPanel, onde passou-se também a classe do bean e o descriptor.

 

Com isso já se tem o formulário criado. Basta agora configurar o evento dos botões, que nesse caso serão um pouco diferentes do que geralmente se usa em aplicações Swing.

 

ApplicationAction representa uma ação a ser executada e para isso deve implementar o método execute(). No primeiro ApplicationAction, há as ações de preenchimento do bean com os dados digitados e em seguida uma chamada a System.out.println para se assegurar de que os dados foram armazenados com sucesso, e logo depois uma limpeza nos campos. Para o segundo foi definida apenas a limpeza dos campos. São as ações de Cadastro e Limpeza, respectivamente, que serão utilizadas pelos botões, vistos aqui como JActButton.

 

Com as duas classes criadas e seu XML definido, o projeto deverá ficar como na Figura 01 (visualizado no Eclipse).

 

asapswbep1fig01.jpg 

Figura 01

 

E a aplicação ao ser executada de acordo com a Figura 02.

 

asapswbep1fig02.jpg 

Figura 02

 

Conclusões

Nesta primeira parte do artigo, alguns conceitos introdutórios a respeito do framework foram vistos e a partir das próximas partes serão vistos mais componentes interessantes para enriquecer a aplicação.

 

Um grande abraço e até a próxima,

Adriano

Leia todos artigos da série