[RESOLVIDO] Alguém ai enxerga o erro neste DAO, UPDATE

Seguinte tenho uma TableModel (AbstractTableModel), que através de um metodo getLinha pega os dados da linha da tabela e passa para uma classe de manipulaçãoCliente(formulário), mas acontece que o mesmo não está recuperando o idCompra do cliente.

Classe CompraDAO


 public static final String ALTERAR_COMPRA = "UPDATE compra SET descricao = ?, quant = ?, valor = ?, date =? WHERE id_compra = ?";

   //alterar compra
    public void alterarCompra(Compra compra) throws SQLException{
        Connection conn = new ConexionFactory().getConn();
        PreparedStatement stmt = null;
        
        String sql = ALTERAR_COMPRA;
        
        try {
           stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
               
            
               stmt.setString(1, compra.getDescricao());
               stmt.setInt(2, compra.getQuant());
               stmt.setDouble(3, compra.getValor());
               stmt.setDate(4, new Date(compra.getDate().getTimeInMillis()));
                             
               stmt.setLong(5, compra.getIdCompra());
               
               stmt.executeUpdate();
               
               System.out.println("Cliente altualizado com sucesso");
               
               
               }catch (SQLException exc) {
            exc.printStackTrace();
            
        } finally {
            conn.close();
            stmt.close();
    }
    
    }//fim

Classe de Manipulacao

[code]

//linha para o update
public Cliente getClienteUpdate(){

  int row = ClientesGUI.tabela.getSelectedRow();
  Cliente dtm = ClientesGUI.dtm.getLinha(row);
  
  
  cliente.setIdCliente(dtm.getIdCliente());
  cliente.setNome(removerAcentos(tfNome.getText().toUpperCase()));
  cliente.setCpf(removerMascara(tfCPF.getText()));
  cliente.setEndereco(removerAcentos(tfEndereco.getText().toUpperCase()));
  cliente.setTelefone(removerMascara(tfTelefone.getText()));
  
  return cliente;
}

//Classe Manipulação ação para o botão OK.
//o codigo que não funciona e daqui para baixo o resultado é que não retorna o valor do idCompra

        Compra c = getComprasUpdate();
        int confirm = 0;
        //dados a serem incluidos no banco
     String dados = "id: "+c.getIdCompra();
     
     String mensagem = "Confirme os dados da compra: \n";
     confirm = JOptionPane.showConfirmDialog(rootPane, mensagem +dados, title, confirm);
    
        if(confirm == JOptionPane.OK_OPTION){
        
        try {
            new CompraDao().alterarCompra(c);
            int row = ComprasGUI.tabelaCompras.getSelectedRow();
            ComprasGUI.dtm.atualizar(row, compra);
            
            //falta fazer o metodo para alterar Compra....
        } catch (SQLException ex) {
            Logger.getLogger(ManipulacaoComprasGUI.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    }//fim do if

[/code]

O erro que aparece na tela é esse:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

        at controle.CompraDao.alterarCompra(CompraDao.java:138)
	at vew.ManipulacaoComprasGUI.bOKActionPerformed(ManipulacaoComprasGUI.java:210)

Como pode ser nulo se eu passei o valor da variável através do cliente.setIdCliente(dtm.getIdCliente());
Alguma solução ou dica???

Aqui você tá passando um objeto Compra pro método, certo ?

Esse objeto está sendo obtido aqui, certo ?

O pulo do gato (se eu entendi bem seu problema… é que esse getComprasUpdate(); pode estar retornando null …

Pelo seu código mesmo dá pra comprovar essa suspeita. A mensagem que você exibe aqui

está mostrando o id da compra ?

ja tentou debugar???

Ai onde está o negócio o console do depurador diz:

Ouvindo em javadebug
Executando programa do usuário
Programa do usuário finalizado

a mensagem de erro que recebo quando tento rodar o update é essa:


Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at controle.CompraDao.alterarCompra(CompraDao.java:138)
	at vew.ManipulacaoComprasGUI.bOKActionPerformed(ManipulacaoComprasGUI.java:210)
	at vew.ManipulacaoComprasGUI.access$100(ManipulacaoComprasGUI.java:21)
	at vew.ManipulacaoComprasGUI$2.actionPerformed(ManipulacaoComprasGUI.java:110)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
	at java.awt.Component.processMouseEvent(Component.java:6504)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
	at java.awt.Component.processEvent(Component.java:6269)
	at java.awt.Container.processEvent(Container.java:2229)
	at java.awt.Component.dispatchEventImpl(Component.java:4860)
	at java.awt.Container.dispatchEventImpl(Container.java:2287)
	at java.awt.Component.dispatchEvent(Component.java:4686)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
	at java.awt.Container.dispatchEventImpl(Container.java:2273)
	at java.awt.Window.dispatchEventImpl(Window.java:2713)
	at java.awt.Component.dispatchEvent(Component.java:4686)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
	at java.awt.EventQueue.access$000(EventQueue.java:101)
	at java.awt.EventQueue$3.run(EventQueue.java:666)
	at java.awt.EventQueue$3.run(EventQueue.java:664)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.awt.EventQueue$4.run(EventQueue.java:680)
	at java.awt.EventQueue$4.run(EventQueue.java:678)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
CONSTRUÍDO COM SUCESSO (tempo total: 38 segundos)

Pelo o que entendi, ele diz que o indicador idCompra está null, mas eu enviei através do método citado acima.

Mas obrigado pela resposta.

Ademilton é justamente isso, o idCompra retorna null.

eu fiz o OptionPane justamente para comprovar a teoria, mas vi e revi o código e não achei o erro na Classe CompraDao e no método getUpdateCompra e no evento do botão ok, mas vou colocar aqui a tableModel que uso para a classe compra, quem sabe alguém não vê o que não vi.

//
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controle;

import java.text.SimpleDateFormat;
import java.util.List;
import javax.swing.table.AbstractTableModel;
import model.dominio.Compra;

/**
 *
 * @author User
 */
public class ComprasTableModel extends AbstractTableModel{
    private final int COL_DESCRICAO = 0;
    private final int COL_QUANT = 1;
    private final int COL_VALOR = 2;
    private final int COL_DATE = 3;
    
    
    //tratando data
    SimpleDateFormat dataFormatada = new SimpleDateFormat("dd/mm/YYYY");
    //nome das colunas da tabela
    
    private List<Compra> listaCompras;
    Compra compra = new Compra();

    public ComprasTableModel(List<Compra> listaCompras) {
        this.listaCompras = listaCompras;
    }


//numero de linhas
    public int getRowCount(){
        return listaCompras.size();
    }
    public int getColumnCount(){
        return 4;
    }
    //define o que cada coluna conterá do objeto
    @Override
    public Object getValueAt(int rowIndex, int columnIndex){
    
        Compra c = listaCompras.get(rowIndex);
        if(columnIndex == COL_DESCRICAO){
            return c.getDescricao();
        }else if(columnIndex == COL_QUANT){
            return c.getQuant();
        }else if(columnIndex == COL_VALOR){
            return c.getValor();
        }else if (columnIndex == COL_DATE){
            
            return new SimpleDateFormat("dd/MM/YYYY").format( c.getDate().getTime());
        }
        return null;

        
    }

    //determina o nome das colunas
    public String getColumnName(int column){
        if(column == COL_DESCRICAO){
            return "Descrição";
        }else if(column == COL_QUANT){
            return "Quantidade";
        }else if(column == COL_VALOR){
            return "Valor";
        }else if (column == COL_DATE){
            return "Data";
        }
        return "";
    }
    
    //determina que tipo de objeto cada coluna irá suportar
    public Class<?> getColumnClass(int columnIndex){
        if(columnIndex == COL_DESCRICAO){
            return String.class;
        }else if(columnIndex == COL_QUANT){
            return Integer.class;
        }else if(columnIndex == COL_VALOR){
            return Double.class;
        }else if (columnIndex == COL_DATE){
            return java.util.Calendar.class;
        }
        return String.class;

    }
    //acrescentar uma linha a tabela
    public void addRow(Compra compra){     
        listaCompras.add(compra); 
        int ultimoIndice = getRowCount()-1;
        this.fireTableRowsInserted(ultimoIndice, ultimoIndice);

    }   
    
    /* Este método foi criado para remover uma linha   
        específica do JTable, de acordo com linha fornecida pelo   
        parâmetro "int row" */  
    
    public Compra getLinha(int row){
        return listaCompras.get(row);
      
    }
    
    public void removeRow(int row) {     
         listaCompras.remove(row);     
         this.fireTableRowsDeleted(row, row);     
    }     
    
    public void removeCliente(Compra compra) {  
        // Remove o sócio da linha especificada.  
        listaCompras.remove(compra);  
        this.fireTableDataChanged();  
    }
    public void atualizar(int row, Compra compra){
        listaCompras.set(row, compra);
        this.fireTableRowsUpdated(row, row);
    }
    
}
//fim da classe

Siga as pistas que o erro de execução te dá, colega… ainda acredito que o problema esteja no retorno desse getComprasUpdate(). Cadê o código dele ?

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at controle.CompraDao.alterarCompra(CompraDao.java:138) ...
NPE acontece quando você tenta fazer uma operação com alguma variável nula (Se o seu objeto é nulo, como vai invocar um método?)

O que há exatamente nesta linha do seu stack trace?

lá vai metodo getComprasUpdate


private Compra getComprasUpdate() {
        
        int row = ComprasGUI.tabelaCompras.getSelectedRow();
        Compra dtm = ComprasGUI.dtm.getLinha(row);
        
        compra.setIdCompra(dtm.getIdCompra());
        compra.setRelCliente(dtm.getRelCliente());
        compra.setDescricao(tfDescricao.getText().toUpperCase());
        compra.setQuant(Integer.valueOf( tfQuant.getText()));
        compra.setValor(Double.valueOf(tfValor.getText()));
        compra.setDate(tfData.getCalendar());
        
        return compra;
    }

erico_Kl

linha 138 do CompraDao.java stmt.setDate(4, new Date(compra.getDate().getTimeInMillis()));

Detalhe quando comento a linha 136 e passo passo e rodo o programa o erro aparece como sendo na linha 138 ComprasDao.java

 stmt.setLong(5, compra.getIdCompra());

Quer saber o que é mais interessante. Quando testo a Classe ComprasDao.java o método do update funciona

Provavelmente alguns atributos do seu objeto compra estão nulos.

Imprima-os na entrada do método:

public void alterarCompra(Compra compra) throws SQLException{
   System.out.println("date: " + compra.getDate());
   System.out.println("id: " + compra.getIdCompra());
   //...

Provavelmente vc vai ver estes valores retornando nulo. Aí o que você precisa checar é o método getComprasUpdate. O que tem de errado nele pra ele não trazer todos os valores adequadamente.

wagnerFrancisco é justamente isto eles retornam vazios. agora o que me deixa doido e que todo resto retorna, e quando testo o CompraDao.java ele funciona

O CompraDAO não tem nada a ver com o erro.

Esta compra você está adicionando depois que a tabela foi montada? O id vem de onde? Confira se quando você insere os dados na tabela (addRow) os dados estão lá corretamente.

Sim insere normalmente. Eu penso que seja alguma coisa do tipo a tabela vai com a linha vazia, mas se fosse assim os outros dados não apareceriam, apareceria toda a linha como nula.

Cara o negócio é louco, só vendo para se ter uma ideia.

Quando você imprime os dados de compra aqui:

public void addRow(Compra compra){ 
   System.out.println("idCompra: " + compra.getIdCompra());
   System.out.println("data: " + compra.getData());
   //...

Tem alguma coisa? Você tá gerando o id em algum lugar? Me parece que alguns valores já chegam nulos aí.

aqui está meu projeto:

vai ficar melhor de entender.

https://sites.google.com/site/psicoppardo/imagem/fichasDnZefinha.rar?attredirects=0&d=1

o metodo eddRow retornou:

idCompra: 29

data: java.util.GregorianCalendar[time=1345898216614,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="GMT-03:00",offset=-10800000,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=2,minimalDaysInFirstWeek=1,ERA=1,YEAR=2012,MONTH=7,WEEK_OF_YEAR=35,WEEK_OF_MONTH=4,DAY_OF_MONTH=25,DAY_OF_YEAR=238,DAY_OF_WEEK=7,DAY_OF_WEEK_IN_MONTH=4,AM_PM=0,HOUR=9,HOUR_OF_DAY=9,MINUTE=36,SECOND=56,MILLISECOND=614,ZONE_OFFSET=-10800000,DST_OFFSET=0]

CONSTRUÍDO COM SUCESSO (tempo total: 37 segundos)

vagner o metodo addRow retornou

  idCompra: 29
data: java.util.GregorianCalendar[time=1345898216614,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="GMT-03:00",offset=-10800000,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=2,minimalDaysInFirstWeek=1,ERA=1,YEAR=2012,MONTH=7,WEEK_OF_YEAR=35,WEEK_OF_MONTH=4,DAY_OF_MONTH=25,DAY_OF_YEAR=238,DAY_OF_WEEK=7,DAY_OF_WEEK_IN_MONTH=4,AM_PM=0,HOUR=9,HOUR_OF_DAY=9,MINUTE=36,SECOND=56,MILLISECOND=614,ZONE_OFFSET=-10800000,DST_OFFSET=0]
CONSTRUÍDO COM SUCESSO (tempo total: 37 segundos)

Cara acho que descobri o problema. Parece que a tableModel que eu construo não é a mesmo que aparece na tabela, pois quando eu insiro um dado e logo após vou atualizar o mesmo dado ele atualiza. Então tudo parace que o erro está na classe comprasGUI.java


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package vew;

import controle.ClienteDao;
import controle.CompraDao;
import controle.ComprasTableModel;
import java.awt.Dimension;
import java.sql.SQLException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import model.dominio.Cliente;
import model.dominio.Compra;

/**
 *
 * @author User
 */
public class ComprasGUI extends javax.swing.JInternalFrame {

    
    public static ComprasTableModel dtm;
    public static int id;
    
    /**
     * Creates new form ComprasGUI
     */
    public ComprasGUI() throws SQLException {
        initComponents();
        preencherComboClientes();
        
        getRootPane().setDefaultButton(bPesquisar);
        
    }
    //janela no centro
     public void setPosicao(){
        Dimension d = this.getDesktopPane().getSize();
        this.setLocation(15+(d.width - this.getSize().width)/5, 15+(d.height - this.getSize().height)/5);
    }
    //acionamento da tecla enter
    
    public static String cpf(String cpf){
        
                  
        String bloco1 = cpf.substring(0, 3);  
        String bloco2 = cpf.substring(3, 6);  
        String bloco3 = cpf.substring(6, 9);  
        String bloco4 = cpf.substring(9, 11);  
          
        cpf = bloco1+"."+bloco2+"."+bloco3+"-"+bloco4;  
          
        return cpf;          
        
    }
    
        public static String telefoneFormatado(String cpf){
        
                  
        String bloco1 = cpf.substring(0, 3);  
        String bloco2 = cpf.substring(3, 7);  
        String bloco3 = cpf.substring(7, 11);  
                  
        cpf = "("+bloco1+") "+bloco2+"-"+bloco3;  
          
        return cpf;          
        
    }
//preencher combobcox
    public void preencherComboClientes() throws SQLException{
        List<Cliente> lista = new ClienteDao().listarTodos();
        
        cbClientes.removeAllItems();
        cbClientes.setAutocompletar(true);
        for(Cliente cliente : lista){
            cbClientes.addItem(cliente.getNome());
        }
    }
    
    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        bFechar = new javax.swing.JToggleButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        tabelaCompras = new javax.swing.JTable();
        bNovo = new javax.swing.JButton();
        bAlterar = new javax.swing.JToggleButton();
        bExcluir = new javax.swing.JButton();
        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        tfPesqCPF = new javax.swing.JTextField();
        bPesquisar = new javax.swing.JButton();
        cbClientes = new componentes.UJComboBox();
        jLabel4 = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        tfCliente = new javax.swing.JTextField();
        tfCPF = new javax.swing.JTextField();
        tfCod = new javax.swing.JTextField();
        jLabel6 = new javax.swing.JLabel();
        bOK = new javax.swing.JButton();
        jLabel7 = new javax.swing.JLabel();
        jLabel8 = new javax.swing.JLabel();
        tfEndereco = new javax.swing.JTextField();
        jLabel9 = new javax.swing.JLabel();
        tfTelefone = new javax.swing.JTextField();

        setTitle("Fichas Dn Zefinha - Compras");

        bFechar.setText("fechar");
        bFechar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bFecharActionPerformed(evt);
            }
        });

        tabelaCompras.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Descricao", "Quant", "Valor", "Data"
            }
        ));
        jScrollPane1.setViewportView(tabelaCompras);

        bNovo.setText("Nova Compra");
        bNovo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bNovoActionPerformed(evt);
            }
        });

        bAlterar.setText("Alterar Compra");
        bAlterar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bAlterarActionPerformed(evt);
            }
        });

        bExcluir.setText("Excluir Compra");

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Pesquisa Cliente"));

        jLabel1.setText("Nome:");

        jLabel2.setText("ou");

        jLabel3.setText("CPF:");

        bPesquisar.setText("Pesquisar");
        bPesquisar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bPesquisarActionPerformed(evt);
            }
        });

        cbClientes.setEditable(true);

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(bPesquisar)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addComponent(jLabel1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(cbClientes, javax.swing.GroupLayout.PREFERRED_SIZE, 367, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jLabel2)
                        .addGap(32, 32, 32)
                        .addComponent(jLabel3)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(tfPesqCPF, javax.swing.GroupLayout.PREFERRED_SIZE, 196, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addGap(39, 39, 39))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jLabel2)
                    .addComponent(jLabel3)
                    .addComponent(tfPesqCPF, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(cbClientes, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 17, Short.MAX_VALUE)
                .addComponent(bPesquisar))
        );

        jLabel4.setText("Cliente:");

        jLabel5.setText("CPF");

        tfCliente.setBackground(new java.awt.Color(204, 204, 204));
        tfCliente.setEditable(false);
        tfCliente.setForeground(new java.awt.Color(0, 0, 153));

        tfCPF.setBackground(new java.awt.Color(204, 204, 204));
        tfCPF.setEditable(false);
        tfCPF.setForeground(new java.awt.Color(0, 0, 153));

        tfCod.setBackground(new java.awt.Color(204, 204, 204));
        tfCod.setEditable(false);
        tfCod.setForeground(new java.awt.Color(0, 0, 153));

        jLabel6.setText("Cod:");

        bOK.setText("OK");
        bOK.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bOKActionPerformed(evt);
            }
        });

        jLabel7.setText("Compras do Cliente:");

        jLabel8.setText("Endereço:");

        tfEndereco.setBackground(new java.awt.Color(204, 204, 204));
        tfEndereco.setEditable(false);
        tfEndereco.setForeground(new java.awt.Color(0, 0, 153));

        jLabel9.setText("Telefone:");

        tfTelefone.setBackground(new java.awt.Color(204, 204, 204));
        tfTelefone.setEditable(false);
        tfTelefone.setForeground(new java.awt.Color(0, 0, 153));

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(20, 20, 20)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(jScrollPane1)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addGroup(layout.createSequentialGroup()
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(tfCod, javax.swing.GroupLayout.PREFERRED_SIZE, 78, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addComponent(jLabel6, javax.swing.GroupLayout.PREFERRED_SIZE, 39, javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addGap(18, 18, 18)
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(tfCliente, javax.swing.GroupLayout.PREFERRED_SIZE, 378, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addComponent(jLabel4)))
                            .addComponent(jLabel8)
                            .addComponent(tfEndereco, javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(jLabel7))
                        .addGap(18, 18, 18)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel9)
                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(tfCPF, javax.swing.GroupLayout.PREFERRED_SIZE, 247, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addComponent(jLabel5))
                                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                                    .addComponent(tfTelefone)
                                    .addGap(18, 18, 18)
                                    .addComponent(bOK)))))
                    .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, 0, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(bNovo)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(bAlterar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(bExcluir)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(bFechar)))
                .addGap(0, 26, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel4)
                    .addComponent(jLabel5)
                    .addComponent(jLabel6))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(tfCliente, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(tfCPF, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(tfCod, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel8)
                    .addComponent(jLabel9))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(tfEndereco, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(tfTelefone, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(bOK))
                .addGap(24, 24, 24)
                .addComponent(jLabel7)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 18, Short.MAX_VALUE)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 241, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(35, 35, 35)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(bNovo)
                    .addComponent(bAlterar)
                    .addComponent(bExcluir))
                .addGap(11, 11, 11)
                .addComponent(bFechar)
                .addGap(60, 60, 60))
        );

        pack();
    }// </editor-fold>                        

    private void bFecharActionPerformed(java.awt.event.ActionEvent evt) {                                        
        // TODO add your handling code here:
        dispose();
    }                                       

    private void bPesquisarActionPerformed(java.awt.event.ActionEvent evt) {                                           
        // TODO add your handling code here:
        String nome =  (String) cbClientes.getSelectedItem();
        String cpf = tfPesqCPF.getText();
        try {
            List <Cliente> lista =  new ClienteDao().pesquisarCliente(nome, cpf);
            for(Cliente cliente: lista ){
            tfCod.setText(Long.toString(cliente.getIdCliente()));
            tfCliente.setText(cliente.getNome());
            tfCPF.setText(cpf(cliente.getCpf()));
            tfEndereco.setText(cliente.getEndereco());
            tfTelefone.setText(telefoneFormatado(cliente.getTelefone()));
            }
            
          bOK.grabFocus();
         
            
        } catch (SQLException ex) {
            Logger.getLogger(ComprasGUI.class.getName()).log(Level.SEVERE, null, ex);
        }
        
            
    }                                          

    private void bOKActionPerformed(java.awt.event.ActionEvent evt) {                                    
        try {
            // pesquisar tabelaCompras
            id = Integer.parseInt(tfCod.getText());
            List<Compra> lista = new CompraDao().listarTodos(id);
            dtm = new ComprasTableModel(lista);
            tabelaCompras.setModel(dtm);
            
            
        } catch (SQLException ex) {
            Logger.getLogger(ComprasGUI.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }                                   

    private void bNovoActionPerformed(java.awt.event.ActionEvent evt) {                                      
        // nova compra
        ManipulacaoComprasGUI manipulacaoComprasGUI = new ManipulacaoComprasGUI();
        PrincipalGUI.jDesktopPane1.add(manipulacaoComprasGUI);
        manipulacaoComprasGUI.setPosicao();
        manipulacaoComprasGUI.setVisible(true);
        manipulacaoComprasGUI.setNovo(1);
    }                                     

    private void bAlterarActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // Código para alterar a compra
         ManipulacaoComprasGUI manipulacaoComprasGUI = new ManipulacaoComprasGUI();
        PrincipalGUI.jDesktopPane1.add(manipulacaoComprasGUI);
        manipulacaoComprasGUI.setPosicao();
        manipulacaoComprasGUI.preecher();
        manipulacaoComprasGUI.setVisible(true);
        manipulacaoComprasGUI.setNovo(0);
    }                                        

    // Variables declaration - do not modify                     
    private javax.swing.JToggleButton bAlterar;
    private javax.swing.JButton bExcluir;
    private javax.swing.JToggleButton bFechar;
    private javax.swing.JButton bNovo;
    private javax.swing.JButton bOK;
    private javax.swing.JButton bPesquisar;
    private componentes.UJComboBox cbClientes;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JLabel jLabel9;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    public static javax.swing.JTable tabelaCompras;
    private javax.swing.JTextField tfCPF;
    private javax.swing.JTextField tfCliente;
    private javax.swing.JTextField tfCod;
    private javax.swing.JTextField tfEndereco;
    private javax.swing.JTextField tfPesqCPF;
    private javax.swing.JTextField tfTelefone;
    // End of variables declaration                   
}

A refatoração no teu código começa tirando o modificador static deste tableModel. :smiley:

tem uma dica de como encapsular o tabelaCompra???

tô seguindo esse tuto: http://www.guj.com.br/articles/147