Evento com perda de Foco para campo JTextField

Cordiais saudações, pessoal do Guj.

Estou tentando usar um evento em que a perda do foco no campo tfId_cliente gera uma busca para ver se existe esse cliente. Porém o IDE Netbeans me exibe a seguinte mensagem de erro e não funciona no programa:

Se alguém tiver uma ideia, por favor, mande uma mensagem. Vocês podem notar na imagem do print, o trecho de código de programa que está com problema. É um evento de troca de foco que não está funcionando.

Atenciosamente,
Ronaldo

P.S.: E em tempo de execução o Netbeans mostra a lista de problemas abaixo, mas continua rodando o programa:

Exception in thread "AWT-EventQueue-0" java.lang.AbstractMethodError
	at java.awt.AWTEventMulticaster.focusGained(AWTEventMulticaster.java:220)
	at java.awt.Component.processFocusEvent(Component.java:6428)
	at java.awt.Component.processEvent(Component.java:6295)
	at java.awt.Container.processEvent(Container.java:2239)
	at java.awt.Component.dispatchEventImpl(Component.java:4889)
	at java.awt.Container.dispatchEventImpl(Container.java:2297)
	at java.awt.Component.dispatchEvent(Component.java:4711)
	at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1954)
	at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:1015)
	at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:639)
	at java.awt.Component.dispatchEventImpl(Component.java:4760)
	at java.awt.Container.dispatchEventImpl(Container.java:2297)
	at java.awt.Component.dispatchEvent(Component.java:4711)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760)
	at java.awt.EventQueue.access$500(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.awt.EventQueue$3.run(EventQueue.java:703)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84)
	at java.awt.EventQueue$4.run(EventQueue.java:733)
	at java.awt.EventQueue$4.run(EventQueue.java:731)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:730)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at br.com.gui.GuiCadastroEndEntCli$1.focusLost(GuiCadastroEndEntCli.java:162)
	at java.awt.AWTEventMulticaster.focusLost(AWTEventMulticaster.java:230)
	at java.awt.Component.processFocusEvent(Component.java:6431)
	at java.awt.Component.processEvent(Component.java:6295)
	at java.awt.Container.processEvent(Container.java:2239)
	at java.awt.Component.dispatchEventImpl(Component.java:4889)
	at java.awt.Container.dispatchEventImpl(Container.java:2297)
	at java.awt.Component.dispatchEvent(Component.java:4711)
	at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1954)
	at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:1024)
	at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:690)
	at java.awt.Component.dispatchEventImpl(Component.java:4760)
	at java.awt.Container.dispatchEventImpl(Container.java:2297)
	at java.awt.Component.dispatchEvent(Component.java:4711)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760)
	at java.awt.EventQueue.access$500(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.awt.EventQueue$3.run(EventQueue.java:703)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84)
	at java.awt.EventQueue$4.run(EventQueue.java:733)
	at java.awt.EventQueue$4.run(EventQueue.java:731)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:730)
	at java.awt.SentEvent.dispatch(SentEvent.java:70)
	at java.awt.DefaultKeyboardFocusManager$DefaultKeyboardFocusManagerSentEvent.dispatch(DefaultKeyboardFocusManager.java:239)
	at java.awt.DefaultKeyboardFocusManager.sendMessage(DefaultKeyboardFocusManager.java:266)
	at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:760)
	at java.awt.Component.dispatchEventImpl(Component.java:4760)
	at java.awt.Container.dispatchEventImpl(Container.java:2297)
	at java.awt.Window.dispatchEventImpl(Window.java:2746)
	at java.awt.Component.dispatchEvent(Component.java:4711)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760)
	at java.awt.EventQueue.access$500(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.awt.EventQueue$3.run(EventQueue.java:703)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84)
	at java.awt.EventQueue$4.run(EventQueue.java:733)
	at java.awt.EventQueue$4.run(EventQueue.java:731)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:730)
	at java.awt.SequencedEvent.dispatch(SequencedEvent.java:156)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
	at java.awt.EventQueue.access$500(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.awt.EventQueue$3.run(EventQueue.java:703)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84)
	at java.awt.EventQueue$4.run(EventQueue.java:733)
	at java.awt.EventQueue$4.run(EventQueue.java:731)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:730)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

A interface FocusListener exige que vc implemente esses dois métodos:

e vc implementou apenas o focusLost. Por isso está dando o erro.

FocusListener: https://docs.oracle.com/javase/7/docs/api/java/awt/event/FocusListener.html

1 curtida

Como você só quer tratar o focusLost, utilize a classe FocusAdapter ao invés da interface FocusListener.

1 curtida

Lucas, obrigado.

No caso não tem nenhum procedimento para ser feito quando esse campo ganha o foco. vou colocar um return dentro do método, isto resolve?

Atenciosamente,
Ronaldo

Staroski, pode me dar um exemplo com o código que eu enviei no print da questão inicial. Realmente eu só quero tratar (fazer um procedimento) quando estou saindo do JTextView tfId_cliente.
Obrigadão.
Ronaldo

Onde você digitou FocusListener, você vai digitar FocusAdapter.

Você está usando uma classe anônima que implementa FocusListener, por isso está tendo erro de compilação, pois teria que implementar todos os métodos da interface.

Então a solução é criar uma classe anônima que estende a classe FocusAdapter, assim você só precisa sobrescrever o método do evento de interesse, neste caso, o focusLost().

1 curtida

Esta rotina de evento quando um JTextField perde o foco é para verificar se um cliente está cadastrado. Mas na linha em que faço a busca ocorre erro. Como faço para forçar uma pausa na execução antes do erro? Qual método ou comando devo colocar na linha anterior?

Obrigado,
Ronaldo

Qual o erro?

Veja a linha que dá erro:

clientes.cliente.setId_cgc_cpf(tfId_cliente.getText());

clientes é um objeto DAO criado no começo do programa e cliente é o registro que contém os campos, na verdade cliente são os campos que seram enviados pelo statement.setString ao comando do sql para fazer a busca (verificação se o cliente existe) da linha abaixo:

if(!clientes.localizar()) {

localizar é um método que executa um select dentro do arquivo de clientes, por isto a referência ao objeto DAO clientes. Mas está linha nunca é executada, o erro está na linha anterior, em que executo um set para o campo de busca guardar o valor do cgc ou cpf do cliente.

Mas o programa que esta dando problema não é a manipulação do cadastro de clientes e sim o cadastro de endereço de entrega. Dentro do cadastro de clientes não tem erro.

Veja o relatório de erros que o Netbeans passa:

Vou anexar os programas relacionados, para caso você queira dar uma olhada:

Programa do erro: GuiCadastroEndEntCli.java

package br.com.gui;

import bdclientes.CliDAO;
import bdclientes.enderecoEntregaCliente.EndEntCliDAO;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
 *
 * @author Ronaldo Rodrigues Godoi
 */
public class GuiCadastroEndEntCli extends JPanel {
    
    JLabel lbCad_end_ent_cli, lbLargura, lbAltura;
    
    JLabel lbId, lbId_cliente, lbTelefone, lbCep, lbEndereco, lbNumero,
           lbComplemento, lbBairro, lbCidade, lbEstado;
    
    JButton btGravar, btAlterar, btExcluir, btNovo, btLocalizar, btCancelar, btSair;
    
    JTextField tfId, tfId_cliente, tfTelefone, tfCep, tfEndereco, tfNumero,
            tfComplemento, tfBairro, tfCidade, tfEstado;

    private EndEntCliDAO endEntClientes;
    private CliDAO clientes;
        
    public GuiCadastroEndEntCli() {
        
        inicializarComponentes();
        definirEventos();
        
    }
    
    public void inicializarComponentes() {
        setLayout(null);
        
        Dimension tela = Toolkit.getDefaultToolkit().getScreenSize();
        lbLargura = new JLabel(""+tela.width);
        lbAltura = new JLabel(""+tela.height);
        int altura = 1000;
        int largura = 1800;
        setBounds(0, 0, largura, altura);
        
        lbCad_end_ent_cli = new JLabel("Cadastro de Endereço de Entrega de Clientes");
        
        lbId = new JLabel("Id do endereço de Entrega");
        lbId_cliente = new JLabel("CPF ou CGC: ");
        lbTelefone = new JLabel("Telefone: ");
        lbCep = new JLabel("CEP: ");
        lbEndereco = new JLabel("Endereço: ");
        lbNumero = new JLabel("Número:");
        lbComplemento = new JLabel("Complemento: ");
        lbBairro = new JLabel("Bairro: ");
        lbCidade = new JLabel("Cidade: ");
        lbEstado = new JLabel("Estado: ");
                
        tfId = new JTextField(10);
        tfId_cliente = new JTextField(20);
        tfTelefone = new JTextField(17); 
        tfCep = new JTextField(9);
        tfEndereco = new JTextField(60);
        tfNumero = new JTextField(10);
        tfComplemento = new JTextField(40);
        tfBairro = new JTextField(60);
        tfCidade = new JTextField(40);
        tfEstado = new JTextField(2);
        
        btGravar = new JButton(null, new ImageIcon("c:/icones/icon12/gravar.gif"));
        btGravar.setToolTipText("Gravar");
        btAlterar = new JButton(null, new ImageIcon("c:/icones/icon12/alterar.gif"));
        btAlterar.setToolTipText("Alterar");
        btExcluir = new JButton(null, new ImageIcon("c:/icones/icon12/excluir.gif"));
        btExcluir.setToolTipText("Excluir");
        btLocalizar = new JButton(null, new ImageIcon("c:/icones/icon12/localizar.png"));
        btLocalizar.setToolTipText("Localizar");
        btNovo = new JButton(null, new ImageIcon("c:/icones/icon12/novo.gif"));
        btNovo.setToolTipText("Novo");
        btCancelar = new JButton(null, new ImageIcon("c:/icones/icon12/cancelar.gif"));
        btCancelar.setToolTipText("Cancelar");
        btSair = new JButton(null, new ImageIcon("c:/icones/icon12/sair.png"));
        btSair.setToolTipText("Sair");
        
        lbCad_end_ent_cli.setBounds(35, 75, 250, 25);
        
        lbId.setBounds(35, 175, 200, 25);
        tfId.setBounds(250, 175, 75, 25);
        lbId_cliente.setBounds(35, 250, 100, 25);
        tfId_cliente.setBounds(115, 250, 150, 25);
        lbTelefone.setBounds(450, 250, 100, 25);
        tfTelefone.setBounds(520, 250, 100, 25);
        lbCep.setBounds(35, 325, 100, 25);
        tfCep.setBounds(75, 325, 100, 25);
        lbEndereco.setBounds(200, 325, 100, 25);
        tfEndereco.setBounds(270, 325, 300, 25);
        lbNumero.setBounds(665, 325, 100, 25);
        tfNumero.setBounds(735, 325, 100, 25);
        lbComplemento.setBounds(35, 400, 150, 25);
        tfComplemento.setBounds(130, 400, 225, 25);
        lbBairro.setBounds(400, 400, 50, 25);
        tfBairro.setBounds(495, 400, 250, 25);
        lbCidade.setBounds(35, 475, 200, 25);
        tfCidade.setBounds(90, 475, 280, 25);
        lbEstado.setBounds(450, 475, 100, 25);
        tfEstado.setBounds(500, 475, 30, 25);
        
        btNovo.setBounds     (45, 550, 75, 75);
        btLocalizar.setBounds(145, 550, 75, 75);
        btGravar.setBounds   (245, 550, 75, 75);
        btAlterar.setBounds  (345, 550, 75, 75);
        btExcluir.setBounds  (445, 550, 75, 75);
        btCancelar.setBounds (545, 550, 75, 75);
        btSair.setBounds     (645, 550, 75, 75);
        lbLargura.setBounds  (745, 550, 75, 75);
        lbAltura.setBounds   (845, 550, 75, 75);
        
        add(lbCad_end_ent_cli);
        add(lbLargura);
        add(lbAltura);
        add(lbId);
        add(tfId);
        add(lbId_cliente);
        add(tfId_cliente);
        add(lbTelefone);
        add(tfTelefone);
        add(lbCep);
        add(tfCep);
        add(lbEndereco);
        add(tfEndereco);
        add(lbNumero);
        add(tfNumero);
        add(lbComplemento);
        add(tfComplemento);
        add(lbBairro);
        add(tfBairro);
        add(lbCidade);
        add(tfCidade);
        add(lbEstado);
        add(tfEstado);
        
        add(btNovo);
        add(btLocalizar);
        add(btGravar);
        add(btAlterar);
        add(btExcluir);
        add(btCancelar);
        add(btSair);
        
        //setResizable(false);
        setBotoes(true, true, false, false, false, false);
        endEntClientes = new EndEntCliDAO();
        if(!endEntClientes.bd.getConnection()) {
            JOptionPane.showMessageDialog(null, "Falha na conexão, o sistema será fechado!");
            System.exit(0);
        }
    }
    
    public void definirEventos() {
        
        tfId_cliente.addFocusListener(new FocusAdapter() {
            public void focusLost(FocusEvent e) {
                System.out.println("Cliente procurado: " + tfId_cliente.getText());
                // aqui deve ter uma pausa... a linha de baixo está com erro.
                clientes.cliente.setId_cgc_cpf(tfId_cliente.getText());
                if(!clientes.localizar()) {
                    JOptionPane.showMessageDialog(null, "Cliente não cadastrado!");
                    tfId.requestFocus();
                } else {
                    tfTelefone.requestFocus();
                }
                return;
            }
        });
        
        btSair.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                endEntClientes.bd.close();
                setVisible(false);
            }
        });
        
        btNovo.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                limparCampos();
                setBotoes(false, false, true, false, false, true);
            }
        });
        
        btCancelar.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                limparCampos();
            }
        });
        
        btGravar.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                
                if(tfId.getText().equals("")) {
                    JOptionPane.showMessageDialog(null, "O código do endereço de entrega não pode estar vazio!");
                    tfId.requestFocus();
                    return; 
                }
                
                if(tfId_cliente.getText().equals("")) {
                    JOptionPane.showMessageDialog(null, "O CPF ou CGC não podem ser vazios!");
                    tfId_cliente.requestFocus();
                    return;
                }
                
                if(tfCep.getText().equals("")) {
                    JOptionPane.showMessageDialog(null, "O CEP não pode ser vazio!");
                    tfCep.requestFocus();
                    return;
                }
                
                if(tfEndereco.getText().equals("")) {
                    JOptionPane.showMessageDialog(null, "O Endereço não pode ser vazio!");
                    tfEndereco.requestFocus();
                    return;
                }
                
                if(tfNumero.getText().equals("")) {
                    JOptionPane.showMessageDialog(null, "O número não pode ser vazio!");
                    tfNumero.requestFocus();
                    return;
                } else {
                    try {
                        int numero = Integer.parseInt(tfNumero.getText());
                    } catch (Exception erro) {
                        JOptionPane.showMessageDialog(null, "O número não pode contém caracteres invalidos!");
                        tfNumero.requestFocus();
                        return;
                    }
                }
                
                if(tfCidade.getText().equals("")) {
                    JOptionPane.showMessageDialog(null, "A cidade não pode ser vazia!");
                    tfCidade.requestFocus();
                    return;
                }
                
                if(tfBairro.getText().equals("")) {
                    JOptionPane.showMessageDialog(null, "O bairro não pode ser vazio");
                    tfBairro.requestFocus();
                    return;
                }
                
                if(tfEstado.getText().equals("")) {
                    JOptionPane.showMessageDialog(null, "O estado não pode estar vazio!");
                    tfEstado.requestFocus();
                    return;
                }
                
                endEntClientes.cli_entrega.setId(tfId.getText());
                endEntClientes.cli_entrega.setId_cliente(tfId_cliente.getText());
                endEntClientes.cli_entrega.setTelefone(tfTelefone.getText());
                endEntClientes.cli_entrega.setCep(tfCep.getText());
                endEntClientes.cli_entrega.setEndereco(tfEndereco.getText());
                endEntClientes.cli_entrega.setNumero(tfNumero.getText());
                endEntClientes.cli_entrega.setComplemento(tfComplemento.getText());
                endEntClientes.cli_entrega.setBairro(tfBairro.getText());
                endEntClientes.cli_entrega.setCidade(tfCidade.getText());
                endEntClientes.cli_entrega.setEstado(tfEstado.getText());
                                
                JOptionPane.showMessageDialog(null, endEntClientes.atualizar(EndEntCliDAO.INCLUSAO));
                limparCampos();
            }
        });
        
        btAlterar.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                endEntClientes.cli_entrega.setId(tfId.getText());
                endEntClientes.cli_entrega.setTelefone(tfTelefone.getText());
                endEntClientes.cli_entrega.setCep(tfCep.getText());
                endEntClientes.cli_entrega.setEndereco(tfEndereco.getText());
                endEntClientes.cli_entrega.setNumero(tfNumero.getText());
                endEntClientes.cli_entrega.setComplemento(tfComplemento.getText());
                endEntClientes.cli_entrega.setBairro(tfBairro.getText());
                endEntClientes.cli_entrega.setCidade(tfCidade.getText());
                endEntClientes.cli_entrega.setEstado(tfEstado.getText());
                JOptionPane.showMessageDialog(null, endEntClientes.atualizar(EndEntCliDAO.ALTERACAO));
                limparCampos();
            }
        });
        
        btExcluir.addActionListener(new ActionListener(){ 
            public void actionPerformed(ActionEvent e) {
                endEntClientes.cli_entrega.setId(tfId.getText());
                endEntClientes.localizar();
                int n = JOptionPane.showConfirmDialog(null, endEntClientes.cli_entrega.getId_cliente(),
                        "Excluir o endereço de entrega de cliente? ", JOptionPane.YES_NO_OPTION);
                if(n == JOptionPane.YES_OPTION) {
                    JOptionPane.showMessageDialog(null, endEntClientes.atualizar(EndEntCliDAO.EXCLUSAO));
                    limparCampos();
                }
            }
        });
        
        btLocalizar.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                atualizarCampos();
            }
        });
        
    }
    
    public void limparCampos() {
        tfId.setText("");
        tfId_cliente.setText("");
        tfTelefone.setText("");
        tfCep.setText("");
        tfEndereco.setText("");
        tfNumero.setText("");
        tfComplemento.setText("");
        tfBairro.setText("");
        tfCidade.setText("");
        tfEstado.setText("");
        setBotoes(true, true, false, false, false, false);
    }
    
    public void atualizarCampos() {
        endEntClientes.cli_entrega.setId(tfId.getText());
        if(endEntClientes.localizar()) {
            tfId_cliente.setText(endEntClientes.cli_entrega.getId_cliente());
            tfTelefone.setText(endEntClientes.cli_entrega.getTelefone());
            tfCep.setText(endEntClientes.cli_entrega.getCep());
            tfEndereco.setText(endEntClientes.cli_entrega.getEndereco());
            tfNumero.setText(endEntClientes.cli_entrega.getNumero());
            tfComplemento.setText(endEntClientes.cli_entrega.getComplemento());
            tfBairro.setText(endEntClientes.cli_entrega.getBairro());
            tfCidade.setText(endEntClientes.cli_entrega.getCidade());
            tfEstado.setText(endEntClientes.cli_entrega.getEstado());
            setBotoes(true, true, false, true, true, true);
        } else {
            JOptionPane.showMessageDialog(null, "Endereço de Cliente não encontrado! " + endEntClientes.cli_entrega.getId());
            limparCampos();
        }
    }
    
    public void setBotoes(boolean bNovo, boolean bLocalizar, boolean bGravar,
            boolean bAlterar, boolean bExcluir, boolean bCancelar) {
        btNovo.setEnabled(bNovo);
        btLocalizar.setEnabled(bLocalizar);
        btGravar.setEnabled(bGravar);
        btAlterar.setEnabled(bAlterar);
        btExcluir.setEnabled(bExcluir);
        btCancelar.setEnabled(bCancelar);
    }
    
}

/*
Table: cli_entrega
Columns:
id varchar(10) PK 
id_cliente varchar(10) 
telefone varchar(20) 
cep varchar(9) 
endereco varchar(60) 
numero int 
complemento varchar(40) 
bairro varchar(60) 
cidade varchar(40) 
estado varchar(2)
*/

Programa DAO do cadastro de clientes que é usado pelo programa acima: CliDAO.java

package bdclientes;

/**
 *
 * @author Ronaldo Rodrigues Godoi
 */

import empresaiv.BD;
import java.sql.*;

/**
 *
 * @author Ronaldo R. Godoi
 */
public class CliDAO {
    
    public Clientes cliente;
    public BD bd;
    private PreparedStatement statement;
    private ResultSet resultSet;
    private String men, sql;
    public static final byte INCLUSAO = 1;
    public static final byte ALTERACAO = 2;
    public static final byte EXCLUSAO = 3;
    
    public CliDAO() {
        bd = new BD();
        cliente = new Clientes();
    }
    
    
    
    public boolean localizar() {
        sql = "select * from clientes where id_cgc_cpf = ?";
        try {
            statement = bd.connection.prepareStatement(sql);
            statement.setString(1, cliente.getId_cgc_cpf());
            resultSet = statement.executeQuery();
            resultSet.next();
            cliente.setId_cgc_cpf(resultSet.getString(1));
            cliente.setCep(resultSet.getString(6));
            cliente.setEndereco(resultSet.getString(7));
            cliente.setNumero(resultSet.getString(8));
            cliente.setComplemento(resultSet.getString(9));
            cliente.setBairro(resultSet.getString(10));
            cliente.setCidade(resultSet.getString(11));
            cliente.setEstado(resultSet.getString(12));
            cliente.setData_cadastro("" + resultSet.getString(13));
            return true;
        } catch(SQLException erro) {
            System.out.println("erro: " + erro.toString() + sql + cliente.getId_cgc_cpf());
            return false;
        }
    }
    
    public String atualizar(int operacao) {
        men = "Operação realizada com sucesso!";
        try {
            if(operacao == INCLUSAO) {
                sql = "insert into clientes values (?, ?, ?, ?, ?, ?, ? , ?, ?, ?, ?, ?, ?)";                
                statement = bd.connection.prepareStatement(sql);
                
                statement.setString(1, cliente.getId_cgc_cpf());
                statement.setString(2, cliente.getFisica_juridica());
                statement.setString(3, cliente.getNome_razao());
                statement.setString(4, cliente.getEmail());
                statement.setString(5, cliente.getTelefone());
                statement.setString(6, cliente.getCep());
                statement.setString(7, cliente.getEndereco());
                statement.setString(8, cliente.getNumero());
                statement.setString(9, cliente.getComplemento());
                statement.setString(10, cliente.getBairro());
                statement.setString(11, cliente.getCidade());
                statement.setString(12, cliente.getEstado());
                statement.setString(13, cliente.getData_cadastro());
                
            } else if(operacao == ALTERACAO) {
                sql = "update clientes set fisica_juridica = ?,"
                        + " nome_razao = ?,"
                        + " email = ?,"
                        + " telefone = ?,"
                        + " cep = ?,"
                        + " endereco = ?,"
                        + " numero = ?,"
                        + " complemento = ?,"
                        + " bairro = ?,"
                        + " cidade = ?,"
                        + " estado = ?,"
                        + " data_cadastro = ? where id_cgc_cpf = ?";
                statement = bd.connection.prepareStatement(sql);
                statement.setString(13, cliente.getId_cgc_cpf());
                statement.setString(1, cliente.getFisica_juridica());
                statement.setString(2, cliente.getNome_razao());
                statement.setString(3, cliente.getEmail());
                statement.setString(4, cliente.getTelefone());
                statement.setString(5, cliente.getCep());
                statement.setString(6, cliente.getEndereco());
                statement.setString(7, cliente.getNumero());
                statement.setString(8, cliente.getComplemento());
                statement.setString(9, cliente.getBairro());
                statement.setString(10, cliente.getCidade());
                statement.setString(11, cliente.getEstado());
                statement.setString(12, cliente.getData_cadastro());
            } else if(operacao == EXCLUSAO) {
                sql = "delete from clientes where id_cgc_cpf = ?";
                statement = bd.connection.prepareStatement(sql);
                statement.setString(1, cliente.getId_cgc_cpf());
            }
            
            if(statement.executeUpdate() == 0) {
                men = "Falha na operação!";
            }
            
        } catch (SQLException erro) {
            men = "Falha na operação! " + erro.toString()+" "+sql;
        }
        
        return men;
        
    }
    
}

/*
Columns:
id_cgc_cpf varchar(16) PK 
fisica_juridica varchar(1) 
nome_razao varchar(60) 
email varchar(80) 
telefone varchar(20) 
cep varchar(9) 
endereco varchar(60) 
numero int 
complemento varchar(40) 
bairro varchar(60) 
cidade varchar(40) 
estado varchar(2) 
data_cadastro datetime
*/

Você pode notar que o método localizar existe em todos os arquivos java DAO e que o problema está na linha que vem antes da pesquisa se o cliente está cadastrado. Isto porque, não quero cadastrar um endereço de entrega de um cliente se esse cliente não existe. Entendeu?

Mas toda esta programação é muito escolar, é só um estudo por enquanto. Estou escrevendo diversos cadastros e este é apenas um. É o primeiro cadastro de endereço de entrega, no caso endereço de entrega de cliente. Haverá também, cadastro de endereço de entrega onde o fornecedor deverá entregar.

Como eu disse: são apenas estudos para um sistema de controle de estoque com cliente, fornecedor, produto, pedidos à cliente e à fornecedor. Estou estudando.

Agradeço a atenção,
qualquer dúvida favor perguntar,
Ronaldo

Você esqueceu de inicializar a variável clientes.

1 curtida

Rapaz, mais que cabeça a minha!!!

Te dei trabalho atoa, perdão.

Obrigado,
Ronaldo

1 curtida

Fiz a declaração new CliDAO() e o problema daquela linha acabou, porém nesta linha abaixo, da classe CliDAO.java, esta ocorrendo outro erro, veja a linha:

statement = bd.connection.prepareStatement(sql);

Note que a linha acima é CliDAO.java:36 e a outra linha citada é GuiCadastroEndCli:169, que está abaixo e chama a linha 36 do CliDAO.java:

if(!clientes.localizar()) {

Abaixo vai uma lista com os erros listados pelo Netbeans:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at bdclientes.CliDAO.localizar(CliDAO.java:36)
	at br.com.gui.GuiCadastroEndEntCli$1.focusLost(GuiCadastroEndEntCli.java:169)
	at java.awt.AWTEventMulticaster.focusLost(AWTEventMulticaster.java:230)
	at java.awt.Component.processFocusEvent(Component.java:6431)
	at java.awt.Component.processEvent(Component.java:6295)
	at java.awt.Container.processEvent(Container.java:2239)
	at java.awt.Component.dispatchEventImpl(Component.java:4889)
	at java.awt.Container.dispatchEventImpl(Container.java:2297)
	at java.awt.Component.dispatchEvent(Component.java:4711)
	at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1954)
	at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:1024)
	at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:690)
	at java.awt.Component.dispatchEventImpl(Component.java:4760)
	at java.awt.Container.dispatchEventImpl(Container.java:2297)
	at java.awt.Component.dispatchEvent(Component.java:4711)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760)
	at java.awt.EventQueue.access$500(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.awt.EventQueue$3.run(EventQueue.java:703)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84)
	at java.awt.EventQueue$4.run(EventQueue.java:733)
	at java.awt.EventQueue$4.run(EventQueue.java:731)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:730)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Prezados colegas do Guj, sei que estou abusando mas agradeceria uma mensagem.
Atenciosamente,
Ronaldo

Teria que descobrir qual referência está nula. Se é db ou connection. Vc consegue descobrir isso?

1 curtida

Essa exceção significa que você está tentando acessar um atributo ou método de uma variável que não foi inicializada.

1 curtida

Na linha do erro, sql contém a expressão que deverá ser executada. Um comando sql. Pode ser que essa expressão não tenha sido bem formada. Vou verificar as operações feitas com os campos e getters e setters da classe Clientes que a instância cliente inicializa. Nosso colega acha que o problema pode ser bd ou a outra entidade que faz parte da linha de comando sql que apresenta erro. Perguntou se eu posso dizer qual destas duas está com erro. Vou tentar responder isto. Se alguém tiver sugestão pode falar.
Obrigado a todos,
Ronaldo

Tente ver qual está NULL, se é a variável bd ou a variável connection. Vc conseguirá ver isso de forma mais fácil usando o modo debug.

Obrigado, Lucas. Vou tentar.

Acho que descobri o erro que está ocorrendo dentro do programa de cadastro de endereço de entrega de clientes. A entidade bd que é da classe BD é inicializada em duas classes DAO diferentes com este mesmo nome bd. E como o arquivo GuiCadastroEndEnt.java faz uso de duas classes DAO diferentes pode estar ocorrendo algum tipo de conflito que resulte em NullPointerException. É isto que está ocorrendo?

Não sei como resolver isto porque toda vez que chamo uma classe DAO é criado uma entidade db (pode ser que não seja este o problema, acho que é este). As classe DAO utilizadas no programa de cadastro de endereço de entrega são CliDAO.java e EndEntCliDAO.java. Como expliquei anteriormente, não tem sentido cadastrar um endereço de entrega para um cliente que não está cadastrado, então fiz uma busca na tabela clientes enquanto cadastrava na tabela cli_entrega, ambas do mesmo banco de dados empresa, do MySQL. Realmente não sei se é este o problema com a linha:

statement = bd.connection.prepareStatement(sql);

Digo, não sei se bd ter sido criado duas vezes, uma em cada linha dentro de um arquivo DAO diferente é o problema desta linha. E o mais importane é que se for este o problema não sei como resolver. Alguém pode me dar umas idéias?
Porém, como pode ser este o erro se bd pertence a GuiCadastroClientes.bd e GuiCadastroEndEntCli.bd, começo a acreditar que esse problema não existe. Mas existe um problema e não sei exatamente qual é. E a conexão bd já existia quando a segunda classe DAO foi chamada para criar este objeto, porque a primeira classe DAO já havia criado uma conexão com o banco de dados empresa. Se for este o problema então preciso aprender um jeito correto de trabalhar com duas tabelas de um mesmo banco de dados sem criar duas vezes a conexão. Se for isto, uma das soluções, é criar código em duplicata, uma prática condenável.
Fico esperando uma luz dos amigos do Guj.

Obrigado,
Ronaldo

Abaixo vai a classe BD.java, para que se tenha uma noção do problema:

package empresaiv;

import java.sql.*;

/**
 *
 * @author Ronaldo R. Godoi
 */
public class BD {
    public Connection connection = null;
    private final String DRIVER = "com.mysql.cj.jdbc.Driver";
    private final String DBNAME = "empresa";
    private final String URL = "jdbc:mysql://localhost:3306/" + DBNAME;
    private final String LOGIN = "root";
    private final String SENHA = "04latosensu10";
    
    /**
     * Método que faz conexão com o banco de dados, retorna true se houve
     * sucesso, ou false em caso negativo.
     */
    public boolean getConnection() {
        try {
            Class.forName(DRIVER);
            connection = DriverManager.getConnection(URL, LOGIN, SENHA);
            System.out.println("Conectou! ");
            return true;
        } catch (ClassNotFoundException erro) {
            System.out.println("Driver não encontrado: " + erro.toString());
            return false;
        } catch(SQLException erro) {
            System.out.println("Falha ao conectar: " + erro.toString());
            return false;
        }
    }
    
    public void close() {
        try {
            connection.close();
            System.out.println("Desconectou...");
        } catch(SQLException erro) {
            System.out.println("Erro ao fechar o arquivo !..." + erro.toString());
        }
    }
}

Não, entenda que NullPointerException acontece quando você tenta acessar um atributo ou método de uma referência null, ou seja tenta manipular uma variável que não foi inicializada.
NullPointerException sempre significa isso!

Seu erro está acontecendo nessa linha aqui:

statement = bd.connection.prepareStatement(sql);

Então você precisa verificar o seguinte:

  • Se é a variável bd que está null e por isso não consegue acessar o atributo connection;
  • Se é o atributo connection que está null e por isso não consegue chamar o prepareStatement.

BD não é uma entidade, entidade são as classes cujos objetos representam registros das tabelas do banco de dados.

O problema é que você não está chamando o método getConnection dessa classe BD.
Esse método é quem inicializa o atributo connection.
Se não chamar ele, o atributo connection sempre está null.

De qualquer forma, essa classe está estranha pois você não deve ficar abrindo e fechando várias conexões com o banco, basta abrir uma única conexão e utilizar ela enquanto seu sistema está aberto.

Sendo assim, se eu fosse você, transformaria essa classe BD em um singleton, dessa forma:

package empresaiv;

import java.sql.*;

/**
 * @author Ronaldo R. Godoi
 */
public final class BD {
    
    private static final String DRIVER = "com.mysql.cj.jdbc.Driver";
    private static final String DBNAME = "empresa";
    private static final String URL = "jdbc:mysql://localhost:3306/" + DBNAME;
    private static final String LOGIN = "root";
    private static final String SENHA = "04latosensu10";
    
    /**
     * Única instância desta classe
     */
    private static BD instance;
    
    /**
     * Obtém a única instância desta classe
     */
    public static synchronized BD getInstance() {
        if (instance == null) {
            instance = new BD();
        }
        return instance;
    }
    
    public final Connection connection;
    
    /**
     * Construtor privado
     */
    private BD() {
        try {
            Class.forName(DRIVER);
            connection = DriverManager.getConnection(URL, LOGIN, SENHA);
            System.out.println("Conectou! ");
        } catch (Throwable t) {
            throw new RuntimeException("Erro ao inicializar BD", t);
        }
    }

    /**
     * Fecha a conexão com o banco
     */
    public void close() {
        try {
            connection.close();
            System.out.println("Desconectou...");
        } catch(Throwable t) {
            throw new RuntimeException("Erro ao fechar BD", t);
        }
    }
}

E em todo lugar onde você precisa usar ela, ao invés de instanciar assim:

BD bd = new BD();

Vai obter a única instância dela assim:

BD bd = BD.getInstance();
2 curtidas

Você tem toda razão, eu não posso ficar criando uma conexão cada vez que uso uma tabela diferente do mesmo banco de dados. É um absurdo. Considere apenas que eu estou aprendendo.

Vou tentar usar o código que você me mandou e fazer algumas alterações nos programas DAO.

Muito obrigado,
Ronaldo