Duvida Jtable

4 respostas
A

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

4 Respostas

ViniGodoy

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?

A

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
ViniGodoy

Como vc formata o campo no ProdutoTableModel?

A

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);

   }

}
Criado 22 de julho de 2011
Ultima resposta 22 de jul. de 2011
Respostas 4
Participantes 2