Aplicando herança para validar um formulario

1 resposta
Vanilson

Pessoal seguinte, por curiosidade e por eu achar que é o mais correcto decidi tentar aplicar o conceito de herança nos casos em que precisamos de validar os dados do formulario, a ideia é de primeiramente declarar as minhas textfields como public e de seguida dar um extends na minha classe que valida o q está a acontecer é que ele manda a msg de erro mesmo q o campo não esteja vazio e duplica a minha janela. Eis o codigo:

Classe Formularioaluno

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package cursojava;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JTextField;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JRadioButton;
import javax.swing.JLabel;
import java.awt.event.ActionListener;
import javax.swing.JPanel;
/**
 *
 * @author Vanilson
 */
public class Formularioaluno extends JFrame implements ActionListener {
    
    private JLabel lblnomealuno, lbldatanascimento, lblestadocivil, lblsexo;
    public JTextField txtnomealuno, txtdatanascimento;
    String[] estadocivil = {"Masculino","Femenino"};
    private JComboBox cboestadocivil;
    private JPanel painellabeltext, painelbotoes, painelsexo;
    private JOptionPane sexo;
    private JButton btnguardar, btnvisualizar, btnlimpar;
    private JRadioButton masculino, femenino;
    
    public Formularioaluno(){
        super("Cadastro de aluno");
        constrFormulario();
        setVisible(true);
        setSize(350,200);
        setResizable(false);
        setLocationRelativeTo(null);
    }
    public void constrFormulario(){
       
        painellabeltext = new JPanel();
        painellabeltext.setLayout(new GridLayout(4,2));
        lblnomealuno = new JLabel("Aluno");
        lbldatanascimento = new JLabel("Data de nascimento");
        lblestadocivil = new JLabel("Estado civil");
        lblsexo = new JLabel("Sexo");
        
        txtnomealuno = new JTextField();
        txtdatanascimento = new JTextField();
        masculino = new JRadioButton("Masculino");
        femenino = new JRadioButton("Femenino");
        cboestadocivil = new JComboBox(estadocivil);
        
        btnguardar = new JButton("Guardar");
        btnguardar.addActionListener(this);
        btnvisualizar = new JButton("Visualizar");
        btnvisualizar.addActionListener(this);
        btnlimpar = new JButton("Limpar");
        btnlimpar.addActionListener(this);
        
        painellabeltext.add(lblnomealuno);
        painellabeltext.add(txtnomealuno);
        
        painellabeltext.add(lbldatanascimento);
        painellabeltext.add(txtdatanascimento);
 
        painellabeltext.add(lblestadocivil);
        painellabeltext.add(cboestadocivil);
        
        painellabeltext.add(lblsexo);
        painelsexo = new JPanel();
        //painelsexo.add(lblsexo);
        painelsexo.add(masculino);
        painelsexo.add(femenino);
        
        painelbotoes = new JPanel();
        painelbotoes.add(btnguardar);
        painelbotoes.add(btnvisualizar);
        painelbotoes.add(btnlimpar);
        
        getContentPane().add(painellabeltext,BorderLayout.NORTH);
        getContentPane().add(painelsexo,BorderLayout.CENTER);
        getContentPane().add(painelbotoes,BorderLayout.SOUTH);
        
        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);        
    }
    public void actionPerformed(ActionEvent e) {
        Beanaluno beanaluno = new Beanaluno();
        Validaaluno validaaluno = new Validaaluno();
        if(e.getSource() == btnguardar){
            validaaluno.validacoes();
            //beanaluno.setNomealuno(txtnomealuno.getText());
        }
        else
            if(e.getSource() == btnvisualizar){
                JOptionPane.showMessageDialog(null,"Dados do aluno " + beanaluno.getNomealuno());
            }
        else
            if(e.getSource() == btnlimpar){
                txtnomealuno.setText(null);
                txtdatanascimento.setText(null);
            }
    }
}

Classe Validaaluno

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package cursojava;

import javax.swing.JOptionPane;

/**
 *
 * @author Vanilson
 */
public class Validaaluno extends Formularioaluno  {
    
    public Validaaluno(){
        
    }
    public void validacoes(){
        if(txtnomealuno.getText().equals(""))
            JOptionPane.showMessageDialog(null, "Digite o nome");
    }
    
}

1 Resposta

discorpio

Boa tarde Vanilson.

A sua idéia é correta e válida.

Dependendo do tipo de validação que voce queira implementar, por exemplo, essa do campo nulo pode inclusive encapsular o método validações na classe genérica, e nesse caso, voce não precisa engessar os JTextFields na classe genérica, bastando somente criar os métodos na classe Genérica desta forma:

public abstract class FormGenerico extends JFrame {


     public abstract void constrFormulario();

     public void validaText(){
             for (int index = 0; index < getComponentCount(); index++){
                   if (getComponent(index) instanceof JTextField) {
                       JTextField txtfield = (JTextField)getComponent(index);
                       if (txtfield.getText().equals("") {
                           JOptionPane.showMessageDialog(null, "Preencha o "+txtfield.getName());
                       }
                    }
              }
     }

     public void clearComponents(){
        for (int index=0; i < getComponentCount(); index++){
            if (getComponent(index) instanceof JTextField){
                JTextField text = (JTextField)getComponent(index);
                text.setText("");
            } else if (getComponent(index) instanceof JTextArea){
                JTextArea txtarea = (JTextArea)getComponent(index);
                txtarea.setText("");
            } else if (getComponent(index) instanceof JComboBox){
                JComboBox combo = (JComboBox)getComponent(index);
                combo.setSelectedIndex(-1);
            } else if(getComponent(index) instanceof JCheckBoxMenuItem){
                JCheckBoxMenuItem check = (JCheckBoxMenuItem)getComponent(index);
                check.setSelected(false);
            } else if (getComponent(index) instanceof JRadioButtonMenuItem){
                JRadioButtonMenuItem radio = (JRadioButtonMenuItem)getComponent(index);
                radio.setSelected(false);
            }
        }
    }
}

Alguns comentários sobre o JFrame.

JFrame tem o método getComponentCount() que retorna o número de components adicionados ao mesmo, e o método getComponent(int index), retorna o componente cujo o índice é fornecido no parâmetro, assim sendo voce pode encapsular inclusive o método de limpar todos os componentes (clearComponents()), como fiz acima, e o método validaText();

Voce vai reparar também que eu não publiquei os componentes JTextFields, e declarei o método constrFormulario() como abstrato, tornando assim a classe abstrata, isto porque voce deve obrigatoriamente considerar que os componentes JTextFields, bem como outros que porventura vieram a existir no formulário, devem ser individuais para cada formulário, pois do jeito que estava, voce estaria engessando componentes e isto não constitui uma boa prática de POO.

O método constrFormulario() estando como abstrato, obriga voce a implementá-lo nas classes herdadas (sub-classes).

Criado 20 de abril de 2011
Ultima resposta 20 de abr. de 2011
Respostas 1
Participantes 2