22 de jun. de 2020

Java Desktop - Cadastro CRUD 7.2 - Métodos do Formulário

Hora de colocar o formulário para funcionar.

Depois de criar o design do formulário, na parte 6.2, falta criar métodos para os componentes do formulário fazerem "alguma coisa de útil": inserirpesquisaratualizar deletar dados - ou CRUD;
Lista das publicações anteriores:
  1. Java Desktop - Cadastro CRUD - 1.2: IDE IntelliJ
  2. Java Desktop - Cadastro CRUD - 2.2: MVC IntelliJ
  3. Java Desktop - Cadastro CRUD - 3.2: MySQL Server
  4. Java Desktop - Cadastro CRUD - 4.2: Classe DAO
  5. Java Desktop - Cadastro CRUD - 5.2: Resource Bundle
  6. Java Desktop - Cadastro CRUD - 6.2: Formulário JFrame

Usando a Orientação a Objetos, veremos: 
  • o método montaCliente, que monta no objeto Cliente os dados preenchidos no formulário, para inserir, atualizar e deletar; 
  • limpaTela para apagar os campos, quando necessário para inserir novos dados; 
  • setCliente, responsável por preencher os campos do formulário com os dados do cliente selecionado na lista de pesquisa; 
  • carregaLista, que "alimenta" o combobox com os registros cadastrados no banco;
  • os métodos de eventos ActionListener, onde os botões são programados para executar cada um sua ação no sistema. 
Para que o CRUD funcione, crie uma outra classe, como dito anteriormente na parte 2.2, a classe ClienteCT.

Classe ClienteCT

Crie a Classe ClienteCT no pacote controle, com o código abaixo. Esta classe "chama" os métodos da classe ClienteDao e atribuem a um objeto da classe Cliente.


1 package br.com.cliente.controle;
2 
3 import java.util.List;
4 import br.com.fabrica.bean.Cliente;
5 import br.com.fabrica.dao.ClienteDao;
6 
7 public class ClienteCT {
8   public void insert(Cliente c){
9   ClienteDao dao = new ClienteDao();
10  dao.insert(c);
11  }
12 
13  public void update(Cliente c){
14  ClienteDao dao = new ClienteDao();
15  dao.update(c);
16  }
17 
18  public void delete(Cliente c){
19  ClienteDao dao = new ClienteDao();
20  dao.delete(c);
21  }
22 
23  public Cliente select(int i){
24  ClienteDao dao = new ClienteDao();
25  Cliente c = (Cliente) dao.select();
26  return c;
27  }
28 
29  public List select(){
30  ClienteDao dao = new ClienteDao();
31  List c = dao.select();
32  return c;
33  }
34 }

Atributo genero para os JRadioButton


Na classe FormCliente é criada automaticamente os atributos de cada componente: campos de textos, botões, etc.

Para os JRadioButton precisamos fazer com que, ao selecionar uma opção, a letra correspondente fique gravada numa variável String.

Para isso, basta acrescentar no final da lista a linha

private String genero;

ButtonGroup


Para "avisar" ao programa que os RadioButton estão no mesmo grupo, temos de criar outro atributo privado - o ButtonGroup, e instanciá-lo. 

private ButtonGroup bt = new ButtonGroup();

Você precisa fazer isso para evitar que o usuário selecione mais de uma opção.

Dentro do construtor (public FormCliente(){ }), você deve atribuir ou adicionar os RadioButton no ButtonGroup:

bt.add(radbtF);
bt.add(radbtM);

Máscara para os campos de texto


Lembra da classe MaskCampos, que criamos na parte 2.2? Agora é hora dela entrar em ação, para facilitar na hora de preencher CPF, Telefone, CEP, etc.

Para isso, basta instanciar a classe e atribuir a cada campo de texto a máscara correspondente - máscara de CPF para o campo de texto de CPF, Telefone para campo de Telefone... (os JFormattedTextField)

É preciso tratar a excessão ParseException (você pode usar o recurso da IDE, digitando a linha - new JFormattedTextField... e com a combinação de teclas Alt + Enter criar o try/catch automático:

MaskCampos maskCampos = new MaskCampos();

        try {
            new JFormattedTextField(maskCampos.maskCep(txtCep));
        } catch (ParseException e) {
            e.printStackTrace();
        }
repita o código para cada campo formatado: 
Ex: new JFormattedTextField(maskCampos.maskTel(txtTel);


AutoCompleteDecorator para deixar o ComboBox dinâmico na hora de pesquisar


Antes de entrar nos métodos, mas uma boa dica é usar recurso AutoCompleteDecorator. Como ele, quando você digitar um nome no combobox, começa uma busca dinâmica pelas letras digitadas na lista de clientes já gravados.

Imagine numa lista de centenas de clientes, você ter de clicar na seta do combo e procurar manualmente!

Para usar o recurso, baixe a biblioteca swingx-all neste link. Você faz a mesma coisa que vimos na parte 3.2 com a biblioteca de conexão do MySQL: adicionar lá na estrutura do projeto.

Depois disso, basta "chamar" o AutoCompleteDecorator no construtor da FormCliente, usando o método decorate e atribuindo ao JComboBox:


AutoCompleteDecorator.decorate(cbPesquisar);

Métodos da Rotina CRUD no Formulário

Em seguida, volte à classe FormCliente. Abaixo dos atributos privados, crie o método montaCliente (observe os comentários nos próximos códigos para melhor entendimento):


1  public Cliente montaCliente(){ 
2    //Pega dos dados digitados nos campos do formulário e atribui ao objeto da classe Cliente;
3    Cliente c = new Cliente();
4     c.setNome(this.txtNome.getText());
5     c.setEndereco(this.txtEndereco.getText());
6     c.setMunicipio(this.txtMunicipio.getText());
7     c.setCep(this.txtCep.getText());
8     c.setTel(this.txtTel.getText());
9     c.setCel(this.txtCel.getText());
10    c.setCpf(this.txtCpf.getText());
11    c.setCnpj(this.txtCnpj.getText());
12    c.setGenero(genero);
13    
14    if(this.txtID.getText() != null && !this.txtID.getText().equals("")){
15     c.setId(Integer.parseInt(this.txtID.getText()));
16     //Condicional para garantir que o campo ID não seja nulo;
17    }
18    return c;
19    } 

Logo abaixo, ponha o código abaixo, limpaTela, método que apaga os campos do formulário: 


1:  public void limpaTela(){  
2:      for(int i = 0; i < contentPane.getComponentCount(); i++){  
3:        //laço de repetição percorrendo o contentPane - JPanel, o painel principal do form  
4:        Component c = contentPane.getComponent(i);  
5:        //Cria um objeto Component c que recebe o componente na posição i do laço for  
6:        if(c instanceof JTextField){ //se o componente c for uma instância de JTextField  
7:          JTextField campo = (JTextField) c;  
8:          //cria uma variável JTextField recebendo o componente c com um cast  
9:          campo.setText(null);  
10:          //apaga o conteúdo do campo JTextField;  
11:        }  
12:      }  
13:      bt.clearSelection();  
14:      //desmarca a seleção do JRadioButton, pelo ButtonGroup  
15:    }  

Para fazer a seleção de um cliente, preenchendo os dados no formulário, o método setCliente:

1  public void setCliente(Cliente c){ 
2     //Preenche formulário de Cliente selecionado no combobox, ao clicar no botão pesquisar;
3     this.txtNome.setText(c.getNome());
4     this.txtEndereco.setText(c.getEndereco());
5     this.txtMunicipio.setText(c.getMunicipio());
6     this.txtCep.setText(c.getCep());
7     this.txtTel.setText(c.getTel());
8     this.txtCel.setText(c.getCel());
9     this.txtCpf.setText(c.getCpf());
10    this.txtCnpj.setText(c.getCnpj());
11    if(c.getGenero().equals("F")){
12     this.rdbtnF.setSelected(true);
13     genero = "F";
14    }else if(c.getGenero().equals("M")){
15     this.rdbtnM.setSelected(true);
16     genero = "M";
17    }
18    //Condicional para seleção do radiobutton do registro selecionado;
19    if(c.getId() != null && c.getId() > 0){
20     this.txtID.setText(c.getId().toString());
21    } //Condicional para garantir que o campo ID não seja nulo;
22   }

Carregar lista no combobox com o método carregaLista:

1 public void carregaLista(){ 
2    //Preenche Combobox com registros do banco de dados
3    ClienteCT mbc = new ClienteCT();
4    
5    List<Cliente> ClienteBd = mbc.select();
6    cbPesquisar.removeAllItems();
7    for (Cliente cliente : ClienteBd) {
8    cbPesquisar.addItem(cliente);
9   }
10  }


ActionListener - colocando os botões para funcionar


O método ActionListener é como um "fofoqueiro": fica só ouvindo para quando acontecer alguma coisa, realizar outra. 

Para os botões, quando a ação de clique acontecer, executar uma ação - Action.


Abra o FormCliente.form no IntelliJ - a parte de design do JFrame, clique com o botão direito do mouse no botão salvar, como na próxima imagem:

java-desktop-crud-metodos

Na próxima lista de opções, escolha a primeira (ActionListener):


java-desktop-crud-metodos

Em seguida, acompanhe abaixo as rotinas de código dentro do método actionPerformed. para cada componente de ação do formulário:

Botão Salvar - confira o código abaixo com os comentários:
(lembre-se de usar o Resource Bundle para as mensagens de confirmação, como no JOptionPane para confirmar ou alertar quando os campos estão vazios):

 btnSalvar.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                if(txtNome.getText() != null && !txtNome.getText().equals("") &&
                    txtEndereco.getText() != null && !txtEndereco.getText().equals("") &&
                    txtCidade.getText() != null && !txtCidade.getText().equals("") &&
                    txtCep.getText() != null && !txtCep.getText().equals("") &&
                    txtTel.getText() != null && !txtTel.getText().equals("") &&
                    txtCel.getText() != null && !txtCel.getText().equals("") &&
                    genero != null && !genero.equals("")){
                    //Condicional para garantir que os campos obrigatórios estejam preenchios antes de salvar

                    Cliente c = montaCliente();
                    //Chama o método montaCliente para pegar os dados e gravar no objeto Cliente c;

                    ClienteCT clienteCT = new ClienteCT();
                    //Instancia a classe de controle ClienteCT

                    clienteCT.insert(c);
                    //Chama o método insert da classe ClienteCT para inserir os dados do objeto Cliente (c) de montaCliente no banco;

                    limpaTela();
                    //Limpar os dados após salvar

                    carregaLista();
                    //Carrega a lista do combobox, atualizando após inserção;

                    JOptionPane.showMessageDialog(null,rb.getString("save.message.success"));
                    //Abre diálogo de mensagem, informando que o cliente foi cadastrado;

                } else {
                    JOptionPane.showMessageDialog(null,rb.getString("fill.field.confirmation"));
                }

            }
        });


As imagens a seguir são o exemplo prático do que este método faz (quando os campos estão preenchidos corretamente:


java-desktop-cadastro-crud-final

Botão Pesquisar: (botão direito do mouse no botão, como feito no de salvar)

btnPesquisar.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                if(cbPesquisar.getSelectedItem() != null && !cbPesquisar.getSelectedItem().equals("")){
                    //Condicional para garantir que o combobox esteja preenchido ao clicar no botão Pesquisar (Lupa)

                    Cliente c = (Cliente) cbPesquisar.getSelectedItem();
                    //Cast - pega o item selecionado no Combobox e transforma num objeto Cliente

                    setCliente(c);
                    //Chama o método setCliente para preencher os campos do formulário
                    //a partir do objeto Cliente da seleção do combobox
                } else {
                    JOptionPane.showMessageDialog(null,rb.getString("fill.combobox.confirmation"));
                }
            }
        });


Exemplo prático:
java-desktop-cadastro-crud-final

Botão Excluir:

btnPesquisar.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                if(cbPesquisar.getSelectedItem() != null && !cbPesquisar.getSelectedItem().equals("")){
                    //Condicional para garantir que o combobox esteja preenchido ao clicar no botão Pesquisar (Lupa)

                    Cliente c = (Cliente) cbPesquisar.getSelectedItem();
                    //Cast - pega o item selecionado no Combobox e transforma num objeto Cliente

                    setCliente(c);
                    //Chama o método setCliente para preencher os campos do formulário
                    //a partir do objeto Cliente da seleção do combobox
                } else {
                    JOptionPane.showMessageDialog(null,rb.getString("fill.combobox.confirmation"));
                }
            }
        });

java-desktop-cadastro-crud-final

Veja o detalhe da condição para confirmar exclusão. A janela de diálogo JOptionPane deve abrir, com a opção NÃO selecionada por padrão, prevenindo no caso do usuário teclar Enter acidentalmente (isso é implementado no último parâmetro - options[1] - array referente às opções Sim e Não)

Usamos a mesma lógica para o botão Editar:, mudando a apenas a mensagem - CONFIRMAR EDIÇÃO, e o método da classe ClienteCT - update():
.
btnEditar.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                String[] options = {"Sim","Não"};
                //Cria variável tipo vetor para definir botão de seleção ativado por padrão
                int conf = JOptionPane.showOptionDialog(null,null,rb.getString("edit.message.confirmation"),
                                                        JOptionPane.OK_CANCEL_OPTION,
                                                        JOptionPane.QUESTION_MESSAGE,null,options,options[1]);
                //Cria variável tipo int com configuração de janela de diálogo de confirmação de exclusão,
                //onde a opção Não fica selecionada por padrão (options[1];
                if(conf == JOptionPane.YES_OPTION){ //Se a opção for SIM
                    Cliente c = montaCliente();
                    ClienteCT clienteCT = new ClienteCT();
                    clienteCT.update(c);
                    limpaTela();
                    carregaLista();
                }
            }
        });

java-desktop-cadastro-crud-final

Para o botão Limpar, basta chamar o método limpaTela();


Depois disso, o sistema precisa deixar um "fofoqueiro" para "escutar" quando um dos RadioButton for selecionado. 😁 

Crie o ActionListener como com os botões, para cada opção do JRadioButton.

Os radios - JRadioButton de escolha de gênero ficam assim:

radbtF.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                genero = "F";
            }
        });
        radbtM.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                genero = "M";
            }
        });

Enfim, até aqui você tem um sistema funcionando o básico. É claro que tem muito mais a ser feito, como cuidar da segurança, com senha de acesso, informar dados como quantidade de clientes cadastrados, relatórios, etc.

Nenhum comentário: