8 de set. de 2018

Java Desktop, Cadastro CRUD - 5: JFrame

Nesta parte elaboramos a janela do sistema, com a classe JFrame.

Continue o projeto criando uma nova classe, FormCliente no pacote view. Lembrando que é necessário configurar a IDE com o windowbuilder, como visto na Parte 1 desta série. Há duas formas de criar a classe: 


1-Criando a Classe JFrame Swing Designer


A primeira forma é criando direto a classe JFrame, usando o recurso da IDE, estendendo JFrame. Faça o caminho Menu File - New - Other (como exemplo na Parte 2) e digite JFrame no campo onde está escrito type filter text selecionado em azul (caso não apareça na lista):


java-desktop-cadastro-crud-parte-5
1-Nova Classe - Eclipse - type filter text

java-desktop-cadastro-crud-parte-5
2-Nova Classe - Eclipse - Swing Designer JFrame
Após clicar em Next e digitar o nome para a classe, o código deverá ficar assim:

1 package br.com.cliente.view;
2 import java.awt.BorderLayout;
3 import java.awt.EventQueue;
4 import javax.swing.JFrame;
5 import javax.swing.JPanel;
6 import javax.swing.border.EmptyBorder;
7 
8 public class FormCliente extends JFrame {
9  private JPanel contentPane;
10 /**  * Launch the application.
11
12   */
13 public static void main(String[] args) {  EventQueue.invokeLater(new Runnable() {   public void run() {
14    try {
15     FormClientes frame = new FormClientes();
16     frame.setVisible(true);
17    } catch (Exception e) {
18     e.printStackTrace();
19    }
20   }
21  });
22 }
23 /**
24  * Create the frame.
25  */
26 public FormClientes() {
27  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
28  setBounds(100, 100, 450, 300);
29  contentPane = new JPanel();
30  contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
31  contentPane.setLayout(new BorderLayout(0, 0));
32  setContentPane(contentPane);
33
34 }
35 }
36

Note que desta forma o Eclipse automaticamente cria o método main. Porém, o método main já está na classe Principal, criada na Parte 2. Para manter o padrão, exclua as linhas do método, deixando código como a seguir:

1 package br.com.cliente.view;
2 import java.awt.BorderLayout;
3 import java.awt.EventQueue;
4 import javax.swing.JFrame;
5 import javax.swing.JPanel;
6 import javax.swing.border.EmptyBorder;
7 
8 public class FormCliente extends JFrame {
9  private JPanel contentPane;
10  public FormClientes() {
11  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
12  setBounds(100, 100, 450, 300);
13  contentPane = new JPanel();
14  contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
15  contentPane.setLayout(new BorderLayout(0, 0));
16  setContentPane(contentPane);
17 }
18 }

No canto inferior esquerdo, clique em Design para alternar para a ferramenta de desenho de janelas. Com um duplo clique na aba da classe FormCliente (como indicado pela seta na imagem abaixo) você maximiza a janela, melhorando a visualização.

java-desktop-cadastro-crud-parte-5
3-Interface de Design JFrame - Eclipse

2-Criando a Classe Normal + Extends JFrame


A segunda forma é criar uma classe normal e depois estender o JFrame (lembrando de usar o recurso do Eclipse - CTRL+Espaço), correspondendo ao código seguinte:


1 package br.com.cliente.view;
2 import javax.swing.JFrame;
3
4 public class FormCliente extends JFrame {
5
6 }

Para ter acesso ao editor de janelas windowbuilder, clique com o botão direito do mouse na classe FormCliente na coluna Package Explorer, opção Open With e WindowBuilder Editor:


java-desktop-cadastro-crud-parte-5
4-Eclipse - Abrindo WindowBuilder
A aba Design aparecerá no canto inferior esquerdo, para alternar entre o código fonte (source) e o editor:


java-desktop-cadastro-crud-parte-5
5-Eclipse - Aba Design
Recordando a imagem do formulário, na Parte 1 desta série, você tem duas opções para compor a janela: 

  1. usando o editor ou Design do Windowbuilder, onde você pode dispor os campos e botões do jeito que você quiser (toma um pouco de tempo mas você pode se divertir um pouco); 
  2. ou simplesmente copiar e colar o código a seguir, que corresponde ao formulário completo, incluindo os campos formatados para CEP, Telefone, CNPJ etc (para ficar como no modelo na primeira parte deste tutorial). 

Ícones para os botões


Além do código, é preciso adicionar uma pasta de imagens, onde estão os arquivos de imagem dos ícones dos botões - salvar, editar, pesquisar, limpar e excluir. 


O primeiro passo é criar uma pasta do tipo source. Clicando com o botão direito em CadCliente na árvore do projeto (no Package Explorer) - New - Source Folder;

Recomendo nomear como resources. Clique com o botão direito nesta pasta criada - New - Folder. O nome deve ser images.

Para terminar, baixe as imagens dos ícones neste link e arras para a pasta images do projeto.

No Designer do formulário, selecione cada botão e clique no quadro à direita de icon na janela de propriedades:


java-desktop-cadastro-crud-parte-5

A primeira opção, Classpath resource, aparece aquela pasta que você criou, resources, e dentro dela está images


java-desktop-cadastro-crud-parte-5

Agora é só selecionar as imagens relacionadas de cada botão - JButton

  • clean.png - btnLimpar;
  • delete.png - btnExcluir;
  • edit.png - btnEditar;
  • save.png - btnSalvar;
  • search.png - btnPesquisar;

Biblioteca autocomplete para facilitar a pesquisa de clientes


Outra dica é adicionar a biblioteca autocomplete, para fazer com que o Combobox de pesquisa funcione dinamicamente - na medida em que você digita, a lista vai mostrando os resultados, como na pesquisa do Google.

Acesse esse link e baixe o arquivo jar. Você precisará adicionar na pasta lib do seu projeto, clicando com o botão direito nele (na seção esquerda, no nome do seu projeto),  Properties -> Java Build Path -> Libraries -> Add Jar / Add External Jar. Adicione o arquivo que você baixou.

Para ativar o recurso de autocompletar no Combobox, como você pode ver no código acima, JComboBox cbPesquisar, acrescente a linha:

AutoCompleteDecorator.decorate(cbPesquisar);

Com isso, a janela estará concluída, embora não estará funcionando ainda. 


Código completo:


1   package br.com.cliente.view;
2   
3   import java.awt.BorderLayout;
4   import java.awt.EventQueue;
5   
6   import javax.swing.JFrame;
7   import javax.swing.JPanel;
8   import javax.swing.border.EmptyBorder;
9   
10  import org.jdesktop.swingx.autocomplete.AutoCompleteDecorator;
11  
12  import br.com.cliente.bean.Cliente;
13  import br.com.cliente.controle.ClienteBC;
14  import br.com.cliente.util.MaskCampos;
15  
16  import javax.swing.JLabel;
17  import javax.swing.JOptionPane;
18  
19  import java.awt.Font;
20  import java.text.ParseException;
21  import java.util.List;
22  
23  import javax.swing.JComboBox;
24  import javax.swing.JTextField;
25  import javax.swing.JRadioButton;
26  import javax.swing.JFormattedTextField;
27  import java.awt.Color;
28  import javax.swing.JButton;
29  import javax.swing.ButtonGroup;
30  import javax.swing.ImageIcon;
31  import java.awt.event.ActionListener;
32  import java.awt.event.ActionEvent;
33  
34  public class FormCliente extends JFrame implements ActionListener {
35  
36   private JPanel contentPane;
37   private JTextField txtNome;
38   private JTextField txtEndereco;
39   private JTextField txtMunicipio;
40   private JFormattedTextField txtCep;
41   private JFormattedTextField txtCel;
42   private JFormattedTextField txtTel;
43   private JFormattedTextField txtCnpj;
44   private JFormattedTextField txtCpf;
45   private JTextField txtID;
46   private JComboBox cbPesquisar;
47   private ButtonGroup bt = new ButtonGroup();
48   
49   private String genero;
50  
51   private JRadioButton rdbtnM;
52   private JRadioButton rdbtnF;
53   private JButton btnSalvar;
54   private JButton btnExcluir;
55   private JButton btnEditar;
56   private JButton btnPesquisar;
57   private JButton btnLimpar;
58   
59   public FormCliente() {
60    setTitle("Cadastro de Clientes");
61    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
62    setBounds(100, 100, 556, 413);
63    contentPane = new JPanel();
64    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
65    setContentPane(contentPane);
66    contentPane.setLayout(null);
67    
68    JLabel lblPesquisar = new JLabel("Pesquisar:");
69    lblPesquisar.setFont(new Font("Franklin Gothic Book", Font.BOLD, 12));
70    lblPesquisar.setBounds(10, 31, 109, 14);
71    contentPane.add(lblPesquisar);
72    
73    JLabel lblNome = new JLabel("Nome/Empresa:");
74    lblNome.setFont(new Font("Franklin Gothic Book", Font.BOLD, 12));
75    lblNome.setBounds(10, 79, 109, 14);
76    contentPane.add(lblNome);
77    
78    JLabel lblEndereo = new JLabel("Endere\u00E7o:");
79    lblEndereo.setFont(new Font("Franklin Gothic Book", Font.BOLD, 12));
80    lblEndereo.setBounds(10, 104, 109, 14);
81    contentPane.add(lblEndereo);
82    
83    JLabel lblNewLabel = new JLabel("Munic\u00EDpio:");
84    lblNewLabel.setFont(new Font("Franklin Gothic Book", Font.BOLD, 12));
85    lblNewLabel.setBounds(10, 129, 109, 14);
86    contentPane.add(lblNewLabel);
87    
88    JLabel lblCep = new JLabel("Cep:");
89    lblCep.setFont(new Font("Franklin Gothic Book", Font.BOLD, 12));
90    lblCep.setBounds(10, 154, 109, 14);
91    contentPane.add(lblCep);
92    
93    JLabel lblTel = new JLabel("Tel:");
94    lblTel.setFont(new Font("Franklin Gothic Book", Font.BOLD, 12));
95    lblTel.setBounds(10, 179, 109, 14);
96    contentPane.add(lblTel);
97    
98    JLabel lblCel = new JLabel("Cel:");
99    lblCel.setFont(new Font("Franklin Gothic Book", Font.BOLD, 12));
100   lblCel.setBounds(10, 204, 109, 14);
101   contentPane.add(lblCel);
102   
103   JLabel lblCpf = new JLabel("Cpf:");
104   lblCpf.setFont(new Font("Franklin Gothic Book", Font.BOLD, 12));
105   lblCpf.setBounds(10, 229, 109, 14);
106   contentPane.add(lblCpf);
107   
108   JLabel lblCnpj = new JLabel("Cnpj:");
109   lblCnpj.setFont(new Font("Franklin Gothic Book", Font.BOLD, 12));
110   lblCnpj.setBounds(10, 254, 109, 14);
111   contentPane.add(lblCnpj);
112   
113   JLabel lblGnero = new JLabel("G\u00EAnero:");
114   lblGnero.setFont(new Font("Franklin Gothic Book", Font.BOLD, 12));
115   lblGnero.setBounds(10, 279, 109, 14);
116   contentPane.add(lblGnero);
117   
118   cbPesquisar = new JComboBox();
119   cbPesquisar.setEditable(true);
120   cbPesquisar.setBounds(129, 28, 283, 20);
121   AutoCompleteDecorator.decorate(cbPesquisar);
122   contentPane.add(cbPesquisar);
123   
124   txtNome = new JTextField();
125   txtNome.setFont(new Font("Franklin Gothic Book", Font.BOLD, 12));
126   txtNome.setBounds(129, 76, 283, 20);
127   contentPane.add(txtNome);
128   txtNome.setColumns(10);
129   
130   txtEndereco = new JTextField();
131   txtEndereco.setFont(new Font("Franklin Gothic Book", Font.BOLD, 12));
132   txtEndereco.setBounds(129, 101, 365, 20);
133   contentPane.add(txtEndereco);
134   txtEndereco.setColumns(10);
135   
136   txtMunicipio = new JTextField();
137   txtMunicipio.setFont(new Font("Franklin Gothic Book", Font.BOLD, 12));
138   txtMunicipio.setBounds(129, 126, 143, 20);
139   contentPane.add(txtMunicipio);
140   txtMunicipio.setColumns(10);
141   
142   rdbtnM = new JRadioButton("M");
148   rdbtnM.setBounds(125, 275, 45, 23);
149   contentPane.add(rdbtnM);
150   
151   rdbtnF = new JRadioButton("F");
157   rdbtnF.setBounds(172, 275, 109, 23);
158   contentPane.add(rdbtnF);
159   
160   bt.add(rdbtnF);
161   bt.add(rdbtnM);
162   
163   MaskCampos mc = new MaskCampos();
164   
165   try {
166    txtCep = new JFormattedTextField(mc.maskCep(txtCep));
167   } catch (ParseException e) {
168    // TODO Auto-generated catch block
169    e.printStackTrace();
170   }
171   txtCep.setFont(new Font("Franklin Gothic Book", Font.BOLD, 12));
172   txtCep.setBounds(129, 151, 143, 20);
173   contentPane.add(txtCep);
174   
175   try {
176    txtTel = new JFormattedTextField(mc.maskTel(txtTel));
177   } catch (ParseException e) {
178    // TODO Auto-generated catch block
179    e.printStackTrace();
180   }
181   txtTel.setFont(new Font("Franklin Gothic Book", Font.BOLD, 12));
182   txtTel.setBounds(129, 176, 143, 20);
183   contentPane.add(txtTel);
184   
185   try {
186    txtCel = new JFormattedTextField(mc.maskCel(txtCel));
187   } catch (ParseException e) {
188    // TODO Auto-generated catch block
189    e.printStackTrace();
190   }
191   txtCel.setFont(new Font("Franklin Gothic Book", Font.BOLD, 12));
192   txtCel.setBounds(129, 201, 143, 20);
193   contentPane.add(txtCel);
194   
195   try {
196    txtCpf = new JFormattedTextField(mc.maskCpf(txtCpf));
197   } catch (ParseException e) {
198    // TODO Auto-generated catch block
199    e.printStackTrace();
200   }
201   txtCpf.setFont(new Font("Franklin Gothic Book", Font.BOLD, 12));
202   txtCpf.setBounds(129, 226, 143, 20);
203   contentPane.add(txtCpf);
204   
205   try {
206    txtCnpj = new JFormattedTextField(mc.maskCnpj(txtCnpj));
207   } catch (ParseException e) {
208    // TODO Auto-generated catch block
209    e.printStackTrace();
210   }
211   txtCnpj.setFont(new Font("Franklin Gothic Book", Font.BOLD, 12));
212   txtCnpj.setBounds(129, 251, 143, 20);
213   contentPane.add(txtCnpj);
214   
215    btnSalvar = new JButton("");
216   btnSalvar.setIcon(new ImageIcon(FormCliente.class.getResource("/img/save.png")));
217   btnSalvar.setBounds(193, 327, 28, 23);
218   btnSalvar.addActionListener(this);
219   btnSalvar.setActionCommand("salvar");
220   contentPane.add(btnSalvar);
221   
222    btnEditar = new JButton("");
223   btnEditar.setIcon(new ImageIcon(FormCliente.class.getResource("/img/edit.png")));
224   btnEditar.setBounds(231, 327, 28, 23);
225   btnEditar.addActionListener(this);
226   btnEditar.setActionCommand("editar");
227   contentPane.add(btnEditar);
228   
229    btnLimpar = new JButton("");
230   btnLimpar.setIcon(new ImageIcon(FormCliente.class.getResource("/img/clean.png")));
231   btnLimpar.setBounds(269, 327, 28, 23);
232   btnLimpar.addActionListener(this);
233   btnLimpar.setActionCommand("limpar");
234   contentPane.add(btnLimpar);
235   
236    btnExcluir = new JButton("");
237   btnExcluir.setIcon(new ImageIcon(FormCliente.class.getResource("/img/delete.png")));
238   btnExcluir.setBounds(308, 327, 28, 23);
239   btnExcluir.addActionListener(this);
240   btnExcluir.setActionCommand("excluir");
241   contentPane.add(btnExcluir);
242   
243    btnPesquisar = new JButton("");
244   btnPesquisar.setIcon(new ImageIcon(FormCliente.class.getResource("/img/search.png")));
245   btnPesquisar.setBounds(422, 22, 28, 23);
246   btnPesquisar.addActionListener(this);
247   btnPesquisar.setActionCommand("pesquisar");
248   contentPane.add(btnPesquisar);
249   
250   JLabel lblId = new JLabel("ID:");
251   lblId.setFont(new Font("Franklin Gothic Book", Font.BOLD, 12));
252   lblId.setBounds(10, 54, 46, 14);
253   contentPane.add(lblId);
254   
255   txtID = new JTextField();
256   txtID.setEditable(false);
257   txtID.setBounds(129, 51, 45, 20);
258   contentPane.add(txtID);
259   txtID.setColumns(10);
260  
261  }

Para não sobrecarregar com muito código e estender muito esta postagem, deixo para a próxima parte a implementação dos métodos para os botões e os campos funcionarem, fazendo finalmente o CRUD no banco de dados.


Java Desktop, Cadastro CRUD - Parte 6