Nesta quarta parte do artigo, serão vistos alguns detalhes finais da aplicação – que ficará praticamente pronta para trabalhar em conjunto com um banco de dados (que será visto no próximo artigo).

Introdução

Um dos recursos explorados na terceira parte do artigo foi a validação de dados, que era feita pelo framework através de alguns atributos configurados no xml descriptor. Inicialmente será mostrado como criar uma classe de validação, ou seja, uma maneira de mostrar à aplicação como validar um certo campo.

Será visto também como importar uma lista de filmes para preencherem a tabela no momento inicial da aplicação, simulando assim uma busca a um banco de dados e como, através de um duplo clique em uma linha dessa tabela, editar o filme selecionado.

Criando uma classe de validação

É comum ser necessário validar dados que não são tratados em uma determinada lista de regras de validação. Uma das possibilidades do framework estudado aqui é a de se criar uma classe que valide um determinado tipo de dados.

Como não há nenhum campo na classe filme que seja extremamente necessário uma validação mais complexa, será utilizado o campo “Duração” para isso, visto que está sendo utilizado o padrão “##h##m##s” (horas, minutos e segundos).

Inicialmente define-se no xml descriptor a classe que irá validar os dados do campo da seguinte maneira:

<property name="duracao" mandatory="true" label="Duração" customValidator="br.com.jm.forms.validadores.ValidadorDeDuracao" />

A Listagem 01 mostra como fica a classe ValidadorDeDuracao contida no mesmo caminho configurado no atributo customValidator de duracao no xml.

package br.com.jm.forms.validadores;

import org.swingBean.descriptor.validator.Validator;

import org.swingBean.util.BeanUtils;

 

public class ValidadorDeDuracao extends Validator{

 

        protected String getGeneratedErrorMessage(String label) {

               return "A formatação obrigatória de " + label + " é ##h##m##s.";

        }

 

        public boolean isValid(Object bean) {

               Object property = BeanUtils.getProperty(bean, getProperty());

               String duracao = (String)property;

              

               return duracao.matches("[0-9]{2}h[0-9]{2}m[0-9]{2}s");

        }

}

Listagem 01

 

ValidadorDeDuracao extende Validator que é uma classe contida na biblioteca do framework e força a implementação de isValid e getGeneratedErrorMessage, que são os dois métodos utilizados por ele para validar e gerar a mensagem para o usuário, respectivamente.

No método isValid, obtém-se um objeto que representa um campo presente na aplicação e que é validado pela classe; ou seja, diferentes campos podem utilizar o mesmo validador, se for necessário.

Após obter o objeto a ser validado, seu valor é armazenado em uma String e em seguida o método, que deve retornar um boolean, retorna um teste feito com o valor através de uma Regular Expression:

·         [0-9]{2} – dois números que vão de 0 a 9;

·         h, m, s são apenas as letras que devem estar entre os números;

Caso o usuário não preencha o campo corretamente, ele receberá a mensagem definida em getGeneratedErrorMessage, como mostra a figura 01.

asuappswibep4fig01.jpg 

Figura 01

 

Iniciando a aplicação com uma lista de filmes

Para simular a ação de buscar uma lista de filmes em um banco de dados, por exemplo, será criada uma classe DAO que possui um método que retorna essa lista.

A Listagem 02 mostra a classe DAO, porém, como não há conexão com banco de dados, os filmes são armazenados de acordo com instâncias criadas manualmente.

package br.com.jm.dao;

 

import java.util.ArrayList;

import java.util.Date;

import java.util.List;

 

import br.com.jm.beans.Filme;

 

public class FilmeDAO {

        public static List<Filme> listAll(){

               Filme filme1 = new Filme(true, 12, new Date(), "Shrek", "", "Animação", "Shrek, burro...", "Descrição do Filme aqui...", "01h30m00s", "www.shrek.com");

               Filme filme2 = new Filme(true, 14, new Date(), "Matadores de Velhinhas", "", "Comédia", "Tom Hanks", "Descrição do Filme aqui...", "02h00m00s", "www.matadoresdevelhinhas.com");

               List<Filme> filmes = new ArrayList<Filme>();

               filmes.add(filme1);

               filmes.add(filme2);

               return filmes;

        }

}

Listagem 02

 

Não há muito segredo nesta classe, visto que esta implementação é independente do framework utilizado.

O único padrão que deve ser seguido, é que o tipo de retorno do método responsável por obter os dados é um List, visto que o SwingBean utiliza este tipo para preencher suas tabelas.

Com a classe criada, é necessário apenas uma chamada a um método dentro da classe responsável pela tabela, no caso do artigo, CadastroFilme:

beanTableModel.setBeanList(FilmeDAO.listAll());

 

O trecho pode ser inserido em qualquer lugar, é claro, após beanTableModel ser criada. O método preenche a tabela de acordo com o List<Filme> retornado por listAll.

Com isso, ao ser iniciada, a aplicação terá uma lista já preenchida, simulando o caso em que os filmes já cadastrados no banco de dados são exibidos.

Editando um filme presente na tabela

Um recurso interessante, e simples de se implementar também, é o de editar instâncias de um objeto presente na tabela com um duplo clique na mesma.

A Listagem 03 mostra como utilizar este recurso.

//início de CadastroFilme

ApplicationAction tableDCAction = new ApplicationAction(){

        public void execute(){

               Filme filme = beanTableModel.getBeanAt(beanTable.getSelectedRow());

               panelFilme.setBean(filme);

        }

};

beanTable.addDoubleClickAction(tableDCAction);

//restante de CadastroFilme

Listagem 03

 

Inicialmente cria-se uma ação como as outras já explicadas nos artigos anteriores, onde se pega a instância de Filme presente na linha selecionada através de getBeanAt(beanTable.getSelectedRow()) e em seguida chama-se o método setBean passando-a como parâmetro.

Ao dar um duplo clique em uma determinada linha, o formulário acima é preenchido com os dados presentes na mesma, onde é possível editá-lo.

 

Conclusões

Com esta quarta parte do artigo, já tem-se uma aplicação contendo recursos interessantes e pronta para ser acoplada a outros frameworks, como o Hibernate, para que os Filmes cadastrados sejam salvos em um banco de dados, por exemplo, mas isso é tema para os próximos artigos.

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

Adriano Castro

Leia todos artigos da série