Duvida Jtable

Pessoal estou com duvida no Jtable, estou usando uma classe TableModel com o nome ProdutoTableModel, a minha duvida e que eu nao consigo consultar o banco de dados na Jtabel:

Eu uso o NetBeans.

import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

public class RelatorioProduto extends javax.swing.JFrame {

    // driver JDBC e URL de banco de dados
   static final String JDBC_DRIVER = "sun.jdbc.odbc.JdbcOdbcDriver";
   static final String DATABASE_URL = "jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb)};DBQ=c:/meubd/banco.mdb";
   static final String USERNAME= "";
   static final String PASSWORD= "";

   private ProdutoTableModel tableModel;
   // consulta padrão seleciona todas as linhas de tabela produto
   static final String DEFAULT_QUERY = "SELECT * FROM produto";

    public RelatorioProduto() {        

           private void btConsultaActionPerformed(java.awt.event.ActionEvent evt) {

        if (evt.getSource()==btConsulta){
        try {
            tableModel = new ProdutoTableModel(JDBC_DRIVER, DATABASE_URL, USERNAME, PASSWORD,DEFAULT_QUERY);

           // Esta linha abaixo esta grifando, creio eu que o erro esteja ai.
          tblConsultaProduto resultTable = new tblConsultaProduto(tableModel);
          // Não sei se e assim que atribuir os valores da tableModel para a tabela tblConsultaProduto

        } catch (SQLException ex) {
            Logger.getLogger(RelatorioProduto.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(RelatorioProduto.class.getName()).log(Level.SEVERE, null, ex);
        }
       }
    }

   
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new RelatorioProduto().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JButton btConsulta;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable tblConsultaProduto;
    // End of variables declaration

}

Help

Se a dúvida é no TableModel, não seria legal você postar para nós o TableModel?
Como vc espera que adivinhemos o que seu ProdutoTableModel está fazendo de errado?

Consegui pessoal, agora estou usando uma TableModel graças ao ViniGodoy , valeu pelo apoio e paciencia rs,

so tem um problema o valor em reais esta aparecendo assim:

atual: 10,00 = 1.0000
queria assim: R$ 10,00,

Como faço isto

Codigo da tela da tabela

import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

public class RelatorioProduto extends javax.swing.JFrame {

    // driver JDBC e URL de banco de dados
   static final String JDBC_DRIVER = "sun.jdbc.odbc.JdbcOdbcDriver";
   static final String DATABASE_URL = "jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb)};DBQ=c:/meubd/banco.mdb";
   static final String USERNAME= "";
   static final String PASSWORD= "";

   private ProdutoTableModel tableModel;
   // consulta padrão seleciona todas as linhas de tabela authors
   static final String DEFAULT_QUERY = "SELECT * FROM produto";
    public RelatorioProduto() {
        
    private void btConsultaActionPerformed(java.awt.event.ActionEvent evt) {

        if (evt.getSource()==btConsulta){
        try {
            tableModel = new ProdutoTableModel(JDBC_DRIVER, DATABASE_URL, USERNAME, PASSWORD,DEFAULT_QUERY);
            JTable.setModel(tableModel);
        } catch (SQLException ex) {
            Logger.getLogger(RelatorioProduto.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(RelatorioProduto.class.getName()).log(Level.SEVERE, null, ex);
        }
       }
    }

   
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new RelatorioProduto().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JTable JTable;
    private javax.swing.JButton btConsulta;
    private javax.swing.JScrollPane jScrollPane1;
    // End of variables declaration

}

Codigo da ProdutoTableModel

// Fig. 25.28: ResultSetTableModel.java
// Um TableModel que fornece dados ResultSet a uma JTable.
import java.sql.Connection;
import java.sql.Statement;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import javax.swing.table.AbstractTableModel;

// Linhas e colunas do ResultSet são contadas a partir de 1 e linhas e
// colunas JTable são contadas a partir de 0. Ao processar
// linhas ou colunas de ResultSet para utilização em uma JTable, é
// necessário adicionar 1 ao número de linha ou coluna para manipular
// a coluna apropriada de ResultSet (isto é, coluna 0 de JTable é a
// coluna de ResultSet 1 e a linha de JTable 0 é a linha de ResultSet 1).
public class ProdutoTableModel extends AbstractTableModel
{
   private Connection connection;
   private Statement statement;
   private ResultSet resultSet;
   private ResultSetMetaData metaData;
   private int numberOfRows;

   // monitora o status da conexão de banco de dados
   private boolean connectedToDatabase = false;

   // construtor inicializa resultSet e obtém seu objeto de metadados;
   // determina número de linhas
   public ProdutoTableModel( String driver, String url,
      String username, String password, String query )
      throws SQLException, ClassNotFoundException
   {
      // carrega classe de driver do banco de dados
      Class.forName( driver );

      // conecta-se ao banco de dados
      connection = DriverManager.getConnection( url, username, password );

      // cria Statement para consultar banco de dados
      statement = connection.createStatement(
         ResultSet.TYPE_SCROLL_INSENSITIVE,
         ResultSet.CONCUR_READ_ONLY );

      // atualiza status de conexão de banco de dados
      connectedToDatabase = true;

      // configura consulta e a executa
      setQuery( query );
   } // fim do construtor ResultSetTableModel

    ProdutoTableModel(ProdutoTableModel tableModel) {
        throw new UnsupportedOperationException("Not yet implemented");
    }
   // obtém a classe que representa o tipo de coluna
    @Override
   public Class getColumnClass( int column )throws IllegalStateException
   {
      // assegura que o banco de dados conexão está disponível
      if ( !connectedToDatabase )
         throw new IllegalStateException( "Not Connected to Database" );

      // determina a classe Java de coluna
      try
      {
         String className = metaData.getColumnClassName( column + 1 );

         // retorna objeto Class que representa className
         return Class.forName( className );
      } // fim do try
      catch ( Exception exception )
      {
         exception.printStackTrace();
      } // fim do catch

      return Object.class; // se ocorrerem os problemas acima, assume tipo Object
   } // fim do método getColumnClass

   // obtém número de colunas em ResultSet
   public int getColumnCount()throws IllegalStateException
   {
      // assegura que o banco de dados conexão está disponível
      if ( !connectedToDatabase )
         throw new IllegalStateException( "Not Connected to Database" );

      // determina número de colunas
      try
      {
         return metaData.getColumnCount();
      } // fim do try
      catch ( SQLException sqlException )
      {
         sqlException.printStackTrace();
      } // fim do catch

      return 0; // se ocorrerem os problemas acima, retorna 0 para o número de colunas
   } // fim do método getColumnCount

   // obtém nome de uma coluna particular em ResultSet
    @Override
   public String getColumnName( int column )throws IllegalStateException
   {
      // assegura que o banco de dados conexão está disponível
      if ( !connectedToDatabase )
         throw new IllegalStateException( "Not Connected to Database" );

      // determina o nome de coluna
      try
      {
         return metaData.getColumnName( column + 1 );
      } // fim do try
      catch ( SQLException sqlException )
      {
         sqlException.printStackTrace();
      } // fim do catch

      return ""; // se ocorrerem problemas, retorna string vazia para nome de coluna
   } // fim do método getColumnName

   // retorna número de linhas em ResultSet
   public int getRowCount()throws IllegalStateException
   {
      // assegura que o banco de dados conexão está disponível
      if ( !connectedToDatabase )
         throw new IllegalStateException( "Not Connected to Database" );

      return numberOfRows;
   } // fim do método getRowCount

   // obtém valor na linha e coluna particular
   public Object getValueAt( int row, int column )
      throws IllegalStateException
   {
      // assegura que o banco de dados conexão está disponível
      if ( !connectedToDatabase )
         throw new IllegalStateException( "Not Connected to Database" );

      // obtém um valor na linha e coluna de ResultSet especificada
      try
      {
         resultSet.absolute( row + 1 );
         return resultSet.getObject( column + 1 );
      } // fim do try
      catch ( SQLException sqlException )
      {
         sqlException.printStackTrace();
      } // fim do catch

      return ""; // se ocorrerem problemas, retorna objeto string vazio
   } // fim do método getValueAt

   // configura nova string de consulta de banco de dados
   public void setQuery( String query )
      throws SQLException, IllegalStateException
   {
      // assegura que o banco de dados conexão está disponível
      if ( !connectedToDatabase )
         throw new IllegalStateException( "Not Connected to Database" );

      // especifica consulta e a executa
      resultSet = statement.executeQuery( query );

      // obtém metadados para ResultSet
      metaData = resultSet.getMetaData();

      // determina o número de linhas em ResultSet
      resultSet.last();                   // move para a última linha
      numberOfRows = resultSet.getRow();  // obtém número de linha

      // notifica a JTable de que modelo foi alterado
      fireTableStructureChanged();
   } // fim do método setQuery

   // fecha Statement e Connection
   public void disconnectFromDatabase()
   {
      if ( !connectedToDatabase )
         return;

      // fecha Statement e Connection
      try
      {
         statement.close();
         connection.close();
      } // fim do try
      catch ( SQLException sqlException )
      {
         sqlException.printStackTrace();
      } // fim do catch
      finally  // atualiza status de conexão de banco de dados
      {
         connectedToDatabase = false;
      } // fim do finally
   } // fim do método disconnectFromDatabase
}  // fim da classe ResultSetTableModel


Como vc formata o campo no ProdutoTableModel?

Vou ser sincero nao tem tratamento de campo, aonde eu faço este tratamento ViniGodoy so bem iniciante, eu estava usando DTM, segui seus conselhos, tenho que me adaptar a este modelo, aonde eu adpto o codigo no ProdutoTableModel, ou na tela da tabela

Eu adaptava assim:

 public void preenche_jtable()
{
   BD.setResultSet("select * from produto");
   
   DefaultTableModel modelo = (DefaultTableModel) tabela.getModel();
   modelo.setNumRows(0);
   
   try
   {
    BD.resultSet.next();

    //Codigo para formata o campo
    Double custo = BD.resultSet.getDouble("custo");
    String custo_formatado = String.format("R$ % 2f",custo);
    
    //Este daqui nem preciso mais por que ja faz automatico
    //Codigo da data de compra
    SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");
    Date data = BD.resultSet.getDate("datacompra");
    String data_formatada = formato.format(data);

    while (BD.resultSet.next())
    //Aqui você adiciona os campos do banco de dados no jTable.
    modelo.addRow(new Object [] {
    BD.resultSet.getString("codigo"),
    BD.resultSet.getString("grupo"),
    BD.resultSet.getString("produto"),
    BD.resultSet.getInt("estoque"),
    BD.resultSet.getDouble("custo"),
    BD.resultSet.getDouble("venda"),
    BD.resultSet.getDate("datacompra"),
    BD.resultSet.getDate("validade"),
    });
    BD.resultSet.first();
   
    }
   catch(SQLException erro) {
          JOptionPane.showMessageDialog(null, "Erro ao listar o jTable "+erro);

   }

}