JGoodies Validation Form Bindings

22/12/2006

2

:D
Estou usando este FrameWorking para validação, criação e preenchimento de formulários.
É muito simples de utilizar e seus beans são automaticamente preenchidos e validados, além de você conseguir construir uma interface bem profissional com poucas linhas de código.
Tenho estudado sobre esse FrameWorking e utilizo várias classes utilitárias que ajudam no desenvolvimento de GUI, não sei se o meu método é o mais correto.
Para me aprofundar mais neste FrameWorking, gostaria de saber a opinião e dicas de todos, pois preciso desenvolver muitas telas.


Responder

Posts

22/12/2006

Joao_rafael1

Estou enviando este pequeno exemplo para que alguém possa me dizer quais os pontos fracos desta abordagem, pois não encontro nenhum exemplo de JGooodies que trabalhe desta maneira.

Primeiro tenho um Bean que representa uma Pessoa Fisíca:
import com.jgoodies.validation.ValidationResult;
import com.jgoodies.validation.Validator;
import com.jgoodies.validation.util.PropertyValidationSupport;
import com.jgoodies.validation.util.ValidationUtils;

public class PessoaFisica extends Cliente implements Validator{
private String cpf;
private String rg;

public PessoaFisica() {
super();
cpf = ´´; rg = ´´;
}

public String getCpf() 
public String getRg() 
public void setCpf(String cpf) {
changeSupport.firePropertyChange(´cpf´,this.cpf,cpf);
this.cpf = cpf;
}
public void setRg(String rg) {
changeSupport.firePropertyChange(´rg´,this.rg,rg);
this.rg = rg;
}
public ValidationResult validate() {
PropertyValidationSupport support = new PropertyValidationSupport(this,´Pessoa´);
if(ValidationUtils.isBlank(nome))
support.addError(´nome´,´O campo ´Nome do Cliente´ é obrigatório´);
if(nascimento == null)
support.addError(´nascimento´,´O campo ´Data de Nascimento´ é obrigatório´);
return support.getResult();
}
}


Este Bean é responsável por carregar os dados de uma Pessoa Física, validar estes dados e lançar eventos quando os seus dados são alterados. Minha dúvida é que talvez essa forma de implementar seria delegar muita responsabilidade para um Bean. Muitos exemplos que eu vi, tratam a parte de validação em uma classe separada.

A classe (JPanel) abaixo, mostra como este Bean é ligado na GUI (para ser automaticamente preenchido) e como é feita a validação de primeiro nível dos dados digitados pelo usuário.


import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.text.ParseException;
import java.util.Arrays;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JTextField;
import javax.swing.text.MaskFormatter;
import org.empresa.restondina.beans.PessoaFisica;
import org.empresa.restondina.control.CadastrarPessoaFisicaControle;
import com.jgoodies.binding.adapter.BasicComponentFactory;
import com.jgoodies.binding.beans.BeanAdapter;
import com.jgoodies.binding.list.SelectionInList;
import com.jgoodies.forms.builder.ButtonBarBuilder;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.validation.Validator;
import com.jgoodies.validation.view.ValidationComponentUtils;

public class PessoaFisicaPainel extends JPanel implements
PropertyChangeListener {
private JTextField nome;
private JTextField nascimento;
private JTextField rua;
private JTextField bairro;
private JTextField cep;
private JTextField cidade;
private JTextField pais;
private JTextField numero;
private JTextField estado;
        private JTextField telefone;
private JTextField cpf;
private JTextField rg;
private JComboBox sexo;
private JButton cadastrar;
private BeanAdapter model;

public PessoaFisicaPainel() {
super();
model = new BeanAdapter(new PessoaFisica(), true);
model.addBeanPropertyChangeListener(this);
nome = BasicComponentFactory.createTextField(model
.getValueModel(´nome´));
nascimento = BasicComponentFactory.createDateField(model
.getValueModel(´nascimento´));
rua = BasicComponentFactory.createTextField(model.getValueModel(´rua´));
bairro = BasicComponentFactory.createTextField(model
.getValueModel(´bairro´));
cep = BasicComponentFactory.createFormattedTextField(model
.getValueModel(´cep´), getMask(´#-´));
cidade = BasicComponentFactory.createTextField(model
.getValueModel(´cidade´));
pais = BasicComponentFactory.createTextField(model
.getValueModel(´pais´));
numero = BasicComponentFactory.createFormattedTextField(model
.getValueModel(´numero´), getMask(´´));
estado = BasicComponentFactory.createTextField(model
.getValueModel(´estado´));
telefone = BasicComponentFactory.createFormattedTextField(model
.getValueModel(´telefone´), getMask(´() -´));
cpf = BasicComponentFactory.createFormattedTextField(model
.getValueModel(´cpf´), getMask(´..-´));
rg = BasicComponentFactory.createTextField(model.getValueModel(´rg´));
sexo = BasicComponentFactory.createComboBox(new SelectionInList(Arrays
.asList(new Object[] { ´Masculino´, ´Feminino´ }), null, model
.getValueModel(´sexo´)));
cadastrar = new JButton(´OK´);
cadastrar.addActionListener(new CadastrarPessoaFisicaControle(this));
this.setLayout(new FormLayout(´c:p:grow´, ´t:p:grow´));
this.add(getPanel(), new CellConstraints().xy(1, 1));
ValidationComponentUtils.setMandatory(nome, true);
ValidationComponentUtils.setMessageKey(nome, ´Pessoa.nome´);
ValidationComponentUtils.setMessageKey(nascimento, ´Pessoa.nascimento´);
ValidationComponentUtils.setMandatory(nascimento, true);
ValidationComponentUtils.updateComponentTreeSeverityBackground(this,
((Validator) model.getBean()).validate());
}
private JPanel getPanel() {
FormLayout formLayout = new FormLayout(
´l:p, 4dlu, 130dlu, 7dlu, l:p, 4dlu, 130dlu´, ´´);
DefaultFormBuilder builder = new DefaultFormBuilder(formLayout);
builder.setDefaultDialogBorder();
builder.appendSeparator(´Dados Pessoais´);
builder.nextLine();
builder.append(´Nome:´, nome, 5);
builder.nextLine();
builder.append(´Nasc.:´, nascimento);
builder.append(´Sexo:´, sexo);
builder.nextLine();
builder.append(´CPF:´, cpf);
builder.append(´RG:´, rg);
builder.nextLine();
builder.appendSeparator(´Endereço´);
builder.append(´Rua:´, rua);
builder.append(´Bairro:´, bairro);
builder.nextLine();
builder.append(´Número:´, numero);
builder.append(´Cidade:´, cidade);
builder.nextLine();
builder.append(´Estado:´, estado);
builder.append(´Pais:´, pais);
builder.nextLine();
builder.append(´Telefone:´, telefone);
builder.append(´CEP:´, cep);
builder.nextLine();
builder.appendRow(´c:10dlu´);
builder.nextLine();
ButtonBarBuilder builderButtons = new ButtonBarBuilder();
builderButtons.addGridded(cadastrar);
builder.append(builderButtons.getPanel(), 3);
return builder.getPanel();
}
private MaskFormatter getMask(String format) {
MaskFormatter maskFormatter = null;
try {
maskFormatter = new MaskFormatter(format);
} catch (ParseException e) {
e.printStackTrace();
}
return maskFormatter;
}
public PessoaFisica getCliente() {
return (PessoaFisica) model.getBean();
}
public void setCliente(PessoaFisica cliente) {
model.setBean(cliente);
}
public void propertyChange(PropertyChangeEvent evt) {ValidationComponentUtils.updateComponentTreeSeverityBackground(this,
((Validator) model.getBean()).validate());
}

}


Esta classe fica ´escutando´ os eventos que são gerados pelo Bean e a cada evento ela tenta validar o Bean e atualizar os componentes na tela. Todos os exemplos sobre JGoodies que eu tive a oportunidade de estudar implementam de forma diferente, com mais camadas entre o Bean, o Validation e a Interface. Este meu exemplo funciona bem, porém não é a melhor prática de programação, pois a interface esta amarrada ao Bean. Gostaria de saber como vocês utilizam este FrameWorking?


Responder