15 de set. de 2018

Java Desktop, Cadastro CRUD: Final

Na parte 5 o sistema ficou parcialmente pronto, com a janela desenhada, porém sem funcionamento. 

Nesta parte final veremos passo a passo os métodos que farão a rotina de inserir, atualizar, pesquisar e deletar dados. 

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 e os métodos da interface de eventos ActionListener, onde os botões são programados para executar cada um sua ação no sistema. 
Para que o CRUD funcione é preciso criar uma outra classe, como dito anteriormente na parte 2, a classe ClienteCT.

java-desktop-cadastro-crud-final


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? 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 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

Seguindo o mesmo passo dado na Parte 4, implementando a interface Dao, implemente a interface de eventos ActionListener, para programar os eventos dos botões JButton e radios JRadioButton do formulário.


java-desktop-cadastro-crud-final
Além de implementar o método ActionListener, é preciso adicionar duas linhas na sequência de códigos de confecção dos botões, no método public FormCliente(), conforme destaque em vermelho abaixo:


1:  btnSalvar = new JButton("");  
2:            btnSalvar.setIcon(new ImageIcon(FormCliente.class.getResource("/img/save.png")));  
3:            btnSalvar.setBounds(193, 327, 28, 23);  
4:            btnSalvar.addActionListener(this);  
5:            btnSalvar.setActionCommand("salvar");  
6:            contentPane.add(btnSalvar);  
7:              
8:             btnEditar = new JButton("");  
9:            btnEditar.setIcon(new ImageIcon(FormCliente.class.getResource("/img/edit.png")));  
10:            btnEditar.setBounds(231, 327, 28, 23);  
11:            btnEditar.addActionListener(this);  
12:            btnEditar.setActionCommand("editar");  
13:            contentPane.add(btnEditar);  
14:              
15:             btnLimpar = new JButton("");  
16:            btnLimpar.setIcon(new ImageIcon(FormCliente.class.getResource("/img/clean.png")));  
17:            btnLimpar.setBounds(269, 327, 28, 23);  
18:            btnLimpar.addActionListener(this);  
19:            btnLimpar.setActionCommand("limpar");  
20:            contentPane.add(btnLimpar);  
21:              
22:             btnExcluir = new JButton("");  
23:            btnExcluir.setIcon(new ImageIcon(FormCliente.class.getResource("/img/delete.png")));  
24:            btnExcluir.setBounds(308, 327, 28, 23);  
25:            btnExcluir.addActionListener(this);  
26:            btnExcluir.setActionCommand("excluir");  
27:            contentPane.add(btnExcluir);  
28:              
29:             btnPesquisar = new JButton("");  
30:            btnPesquisar.setIcon(new ImageIcon(FormCliente.class.getResource("/img/search.png")));  
31:            btnPesquisar.setBounds(422, 22, 28, 23);  
32:            btnPesquisar.addActionListener(this);  
33:            btnPesquisar.setActionCommand("pesquisar");  
34:            contentPane.add(btnPesquisar);  

Em seguida, acompanhe abaixo as rotinas de código dentro do método actionPerformed.

Botão Salvar - confira o código abaixo com os comentários:


1  @Override
2   public void actionPerformed(ActionEvent e) {
3    if(e.getActionCommand().equals(this.btnSalvar.getActionCommand())){
4     //Condicional - se clicar no botão Salvar (disquete)...
5     Cliente c = this.montaCliente();
6     //Chama o método montaCliente para pegar os dados e gravar no objeto Cliente c;
7     ClienteCT cbc = new ClienteCT();
8     //Instancia a classe de controle ClienteCT;
9     cbc.insert(c);
10    //Chama o método insert da classe ClienteCT para inserir os dados do objeto Cliente (c) de montaCliente no banco;
11    this.limpaTela();
12    //Limpa os campos após inserir/salvar dados no banco;
13    this.carregaLista();
14    //Carrega a lista do combobox, atualizando após inserção;
15    JOptionPane.showMessageDialog(null, "Cliente "+txtNome.getText()+" cadastrado...");
16    //Abre diálogo de mensagem, informando que o cliente foi cadastrado;
17   }


java-desktop-cadastro-crud-final

Botão Pesquisar:


1 }else if(e.getActionCommand().equals(this.btnPesquisar.getActionCommand())){
2    //Condicional adicional - se clicar no botão Selecionar (lupa)...
3    if(cbPesquisar.getSelectedItem() != null && !cbPesquisar.getSelectedItem().equals("")){
4     //Condicional - se o campo de pesquisa NÃO estiver em branco ao clicar em Selecionar...
5     Cliente c = (Cliente) cbPesquisar.getSelectedItem();
6     //Cast - pega o item selecionado no combobox e transforma num objeto Cliente;
7     this.setCliente(c);
8     //Chama o método setCliente para preencher os campos do formulário a partir do objeto Cliente da seleção do combobox;
9    }else{
10    JOptionPane.showMessageDialog(null, "Escolha um cliente na lista para pesquisar.");
11    //Caso o campo combobox esteja em branco ao clicar em Selecionar, abre diálogo orientando escolher primeiro um cliente da lista;
12   }
13 }

java-desktop-cadastro-crud-final

Botão Excluir:


1 }else if(e.getActionCommand().equals(this.btnExcluir.getActionCommand())){
2     //Caso o botão acionado seja Excluir (ícone "X");
3     String[] options = {"Sim", "Não"};
4     //Cria variável tipo vetor para definir botão de seleção ativado por padrão;
5     int conf = JOptionPane.showOptionDialog(null, null, "CONFIRMA EXCLUSÃO?", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[1]);
6     //Cria variável tipo int com configuração de janela de diálogo de confirmação de exclusão;
7     if(conf == JOptionPane.YES_OPTION){
8      //Condicional: se a opção for SIM na confirmação...
9      Cliente c = this.montaCliente();
10     //Chama o método montaCliente para pegar os dados e gravar no objeto Cliente c;
11     ClienteCT cbc = new ClienteCT();
12     //Instancia a classe de controle ClienteCT;
13     cbc.delete(c);
14     //Chama o método delete da classe ClienteCT para excluir dados do objeto Cliente (c) de montaCliente no banco;
15     this.limpaTela();
16     //Limpa os campos após excluir dados do banco;
17     this.carregaLista();
18     //Carrega a lista do combobox, atualizando após inserção;
19    }

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():


1 }else if(e.getActionCommand().equals(this.btnEditar.getActionCommand())){
2     //Caso o botão acionado seja Editar (ícone Lápis);
3     String[] options = {"Sim", "Não"};
4     //Cria variável tipo vetor para definir botão de seleção ativado por padrão;
5       int conf = JOptionPane.showOptionDialog(null, null, "CONFIRMA EDIÇÃO?", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[1]);
6     //Cria variável tipo int com configuração de janela de diálogo de confirmação de edição;
7       if(conf == JOptionPane.YES_OPTION){
8      //Condicional: se a opção for SIM na confirmação...
9      Cliente c = this.montaCliente();
10     //Chama o método montaCliente para pegar os dados e gravar no objeto Cliente c;
11     ClienteCT cbc = new ClienteCT();
12     //Instancia a classe de controle ClienteCT;
13     cbc.update(c);
14     //Chama o método update da classe ClienteCT para atualizar dados do objeto Cliente (c) de montaCliente no banco;
15     this.limpaTela();
16     //Limpa os campos após atualizar os dados do banco;
17     this.carregaLista();
18     //Carrega a lista do combobox, atualizando após edição;
19    }
20   }

java-desktop-cadastro-crud-final

Os radios - JRadioButton de escolha de gênero ficam assim, na sequência da implementação, no condicional if:


}else if(e.getActionCommand().equals(this.rdbtnF.getActionCommand())) {  
                genero = "F";  
 }else if(e.getActionCommand().equals(this.rdbtnM.getActionCommand())) {  
                genero = "M";  
 }  

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


Implementação do ActionListener completa:



1 @Override
2  public void actionPerformed(ActionEvent e) {
3   if(e.getActionCommand().equals(this.btnSalvar.getActionCommand())){
4    //Condicional - se clicar no botão Salvar (disquete)...
5    Cliente c = this.montaCliente();
6    //Chama o método montaCliente para pegar os dados e gravar no objeto;
7    ClienteCT cbc = new ClienteCT();
8    //Instancia a classe de controle ClienteCT;
9    cbc.insert(c);
10   //Chama o método insert da classe ClienteCT para inserir dados no banco;
11   this.limpaTela();
12   //Limpa os campos após inserir/salvar dados no banco;
13   this.carregaLista();
14   //Carrega a lista do combobox, atualizando após inserção;
15   JOptionPane.showMessageDialog(null, "Cliente "+txtNome.getText()+" cadastrado...");
16   //Abre diálogo de mensagem, informando que o cliente foi cadastrado;
17  }else if(e.getActionCommand().equals(this.btnPesquisar.getActionCommand())){
18   //Condicional adicional - se clicar no botão Selecionar (lupa)...
19   if(cbPesquisar.getSelectedItem() != null && !cbPesquisar.getSelectedItem().equals("")){
20    //Condicional - se o campo de pesquisa NÃO estiver em branco ao clicar em Selecionar...
21    Cliente c = (Cliente) cbPesquisar.getSelectedItem();
22    //Cast - pega o item selecionado no combobox e transforma num objeto Cliente;
23    this.setCliente(c);
24    //Chama o método setCliente para preencher os campos do formulário a partir do objeto Cliente da seleção do combobox;
25   }else{
26    JOptionPane.showMessageDialog(null, "Escolha um cliente na lista para pesquisar.");
27    //Caso o campo combobox esteja em branco ao clicar em Selecionar, abre diálogo orientando escolher primeiro um cliente da lista;
28   }
29   }else if(e.getActionCommand().equals(this.btnLimpar.getActionCommand())){
30    //Ao clicar no botão Limpar (ícone-vassoura);
31    this.limpaTela();
32    //Aciona o método limpaTela, limpando os campos do formulário;
33   }else if(e.getActionCommand().equals(this.btnExcluir.getActionCommand())){
34    //Caso o botão acionado seja Excluir (ícone "X");
35    String[] options = {"Sim", "Não"};
36    //Cria variável tipo vetor para definir botão de seleção ativado por padrão;
37    int conf = JOptionPane.showOptionDialog(null, null, "CONFIRMA EXCLUSÃO?", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[1]);
38    //Cria variável tipo int com configuração de janela de diálogo de confirmação de exclusão;
39    if(conf == JOptionPane.YES_OPTION){
40     //Condicional: se a opção for SIM na confirmação...
41     Cliente c = this.montaCliente();
42     //Chama o método montaCliente para pegar os dados e gravar no objeto Cliente c;
43     ClienteCT cbc = new ClienteCT();
44     //Instancia a classe de controle ClienteCT;
45     cbc.delete(c);
46     //Chama o método delete da classe ClienteCT para excluir dados do objeto Cliente (c) no banco;
47     this.limpaTela();
48     //Limpa os campos após excluir os dados do banco;
49     this.carregaLista();
50     //Carrega a lista do combobox, atualizando após exclusão;
51    }
52   }else if(e.getActionCommand().equals(this.btnEditar.getActionCommand())){
53    //Caso o botão acionado seja Editar (ícone Lápis);
54    String[] options = {"Sim", "Não"};
55    //Cria variável tipo vetor para definir botão de seleção ativado por padrão;
56      int conf = JOptionPane.showOptionDialog(null, null, "CONFIRMA EDIÇÃO?", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[1]);
57    //Cria variável tipo int com configuração de janela de diálogo de confirmação de edição;
58      if(conf == JOptionPane.YES_OPTION){
59     //Condicional: se a opção for SIM na confirmação...
60     Cliente c = this.montaCliente();
61     //Chama o método montaCliente para pegar os dados e gravar no objeto Cliente c;
62     ClienteCT cbc = new ClienteCT();
63     //Instancia a classe de controle ClienteCT;
64     cbc.update(c);
65     //Chama o método update da classe ClienteCT para atualizar dados do objeto Cliente (c) de montaCliente no banco;
66     this.limpaTela();
67     //Limpa os campos após atualizar os dados do banco;
68     this.carregaLista();
69     //Carrega a lista do combobox, atualizando após edição;
70    }
71   }
72  }

Confira no phpMyAdmin a gravação no banco:


java-desktop-cadastro-crud-final