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
1-Nova Classe - Eclipse - type filter text |
2-Nova Classe - Eclipse - Swing Designer JFrame |
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.
3-Interface de Design JFrame - Eclipse |
2-Criando a Classe Normal + Extends JFrame
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:
4-Eclipse - Abrindo WindowBuilder |
5-Eclipse - Aba Design |
- 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);
- 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:
A primeira opção, Classpath resource, aparece aquela pasta que você criou, resources, e dentro dela está images.
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.