DefaultTableModel (jTable) não funciona corretamente

Olá galera td bem?
Sou iniciante em java e tenho um problema com a minha jTable.
Estou fazendo um cadastro de produtos em uma jFrame, ate ai tudo bem. Consigo fazer o CRUD sem problemas pela interface.
Quando eu executo o meu programa pelo IDENETBeans esta tudo funcionando corretamente, mas quando executo diretamente pelo arquivo .jar eu nao consigo mostrar os dados do meu banco de dados na jTable.

Na minha classe produtos eu fiz o seguinte:

public class jTProdutos extends javax.swing.JFrame {

    DefaultTableModel tmProduto = new DefaultTableModel(null, new String[]{"ID", "Nome do Produto", "Nome do Fabricante", "Descrição Produto", "Qtde", "Valor Unitário (R$)", "Gênero", "Dia Cadastro", "Mes Cadastro", "Ano Cadastro", "Dia Fabricação", "Mes Fabricacao", "Ano Fabricação", "Dia Validade", "Mês Fabricação", "Ano Fabricação"});
    List<Produto> produtos;
    ListSelectionModel lsmProduto;

Abaixo segue o trecho do codigo que desenvolvi para mostrar os resultados na jTable.

public void mostraPesquisa(List<Produto> produtos) {
        while (tmProduto.getRowCount() > 0) {
            tmProduto.removeRow(0);
        }   
        if (produtos.isEmpty()) {
            JOptionPane.showMessageDialog(null, "Nenhum Produto encontrado para esse critério de pesquisa ou o Banco de Dados esta vazio.");
        } else {
            String[] linha = new String[]{null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null};
            for (int i = 0; i < produtos.size(); i++) {
                tmProduto.addRow(linha);
                tmProduto.setValueAt(produtos.get(i).getID_PRODUTO(), i, 0);
                tmProduto.setValueAt(produtos.get(i).getNM_PRODUTO(), i, 1);
                tmProduto.setValueAt(produtos.get(i).getDESCRICAO(), i, 2);
                tmProduto.setValueAt(produtos.get(i).getNM_FABRICANTE(), i, 3);
                tmProduto.setValueAt(produtos.get(i).getQTDE(), i, 4);
                tmProduto.setValueAt(produtos.get(i).getVLR_UNITARIO(), i, 5);
                tmProduto.setValueAt(produtos.get(i).getGENERO(), i, 6);
                tmProduto.setValueAt(produtos.get(i).getDIA_DT_CADASTRO(), i, 7);
                tmProduto.setValueAt(produtos.get(i).getMES_DT_CADASTRO(), i, 8);
                tmProduto.setValueAt(produtos.get(i).getANO_DT_CADASTRO(), i, 9);
                tmProduto.setValueAt(produtos.get(i).getDIA_DT_FABRICACAO(), i, 10);
                tmProduto.setValueAt(produtos.get(i).getMES_DT_FABRICACAO(), i, 11);
                tmProduto.setValueAt(produtos.get(i).getANO_DT_FABRICACAO(), i, 12);
                tmProduto.setValueAt(produtos.get(i).getDIA_DT_VALIDADE(), i, 13);
                tmProduto.setValueAt(produtos.get(i).getMES_DT_VALIDADE(), i, 14);
                tmProduto.setValueAt(produtos.get(i).getANO_DT_VALIDADE(), i, 15);
            }
        }
    }

Dentro das propriedades da table, na guia Codigo e na opção “Codigo de Pós-Iniciação” eu coloquei esse codigo:

jTTabelaProdutos.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
lsmProduto = jTTabelaProdutos.getSelectionModel();
lsmProduto.addListSelectionListener(new ListSelectionListener(){
    public void valueChanged(ListSelectionEvent e){
        if(!e.getValueIsAdjusting()){
            jTTabelaLinhaSelecionada(jTTabelaProdutos);
}
}
});

Não coloquei o codigo todo aki pois este tem quase 1.000 linhas.
O problema é que quando executo pelo NetBeans esta tudo funcionando normalmente, mas quando executo diretamente pelo meu arquivo .jar, ele nao carrega as informações do jTable. :frowning:

Obrigado.

Ricardo, você poderia checar as seguintes coisas:

  1. está registrando o DefaultTableModel tmProduto como TableModel do JTable jTTabelaProdutos?
  1. no método mostraPesquisa() tem certeza que a List produtos não está vazia?

Olá tondatto… obrigado pela ajuda.
Então… eu acho que quando criei a tabela via codigo DefaultTableModel tmProduto = new DefaultTableModel
A lista em questão esta preenchida com pelo menos um registro no banco de dados, pois quando estou criando as tabelas, ja insiro um dado como teste.
Quando executo todo o codigo pelo NetBeans funciona corretamente, posso fazer o CRUD normalmente, mas quando executo pelo .jar… na minha tabela nao aparece as linhas.

Obrigado mais uma vez… :frowning:

Ricardo,

Desculpe pela insistência, mas em nenhum código que você postou você está setando o TableModel que você criou no objeto JTable.

Não use o DefaultTableModel. Siga os links da minha assinatura para aprender a fazer do jeito certo.

Tópico movido para o fórum de interface gráfica.

Olá tondatto…
Vc tem um exemplo pra me mostrar de qual codigo vc esta citando.
Desculpe pela minha inexperiência :frowning:
Se vc me disser como é esse codigo que vc esta pensando ou algum trecho dele, eu procuro no meu projeto e te respondo com mais certeza.

Obrigado.

Ricardo, foi o que eu postei na minha primeira mensagem:

[quote=tondatto]Ricardo, você poderia checar as seguintes coisas:

  1. está registrando o DefaultTableModel tmProduto como TableModel do JTable jTTabelaProdutos?
  1. no método mostraPesquisa() tem certeza que a List produtos não está vazia?[/quote]

Olá tondatto, desculpe pela demora em responder.
Vc tem razão cara, não consegui encontrar em nenhuma das minhas classes o codigo que vc citou antes…jTTabelaProdutos.setTableModel(tmProduto);
Sera que é esse o problema?
Onde eu posso implementar esse codigo no meu codigo fonte para fazermos um teste ?!?!?!?

Mais uma vez obrigado pela ajuda.
Ricardo.

Você pode passar o tmProduto direto no construtor de sua JTable.

ou setar como modelo de tabela depois de ter instanciado a sua JTable

Olá tondatto…
Cara eu dei uma procurada de novo no codigo e o segundo codigo que vc passou jTTabelaProdutos.setModel(tmProduto); ja está inserido no frame jTProdutos.
Este codigo foi gerado automaticamente na hora que eu estava usando o construtor de frames do NetBeans.
Junto com ele tbm tem esse codigo abaixo…

jTTabelaProdutos.setModel(tmProduto);
        jTTabelaProdutos.setToolTipText("Tabela de Produtos contidos no Estoque.");
        jTTabelaProdutos.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        lsmProduto = jTTabelaProdutos.getSelectionModel();
        lsmProduto.addListSelectionListener(new ListSelectionListener(){
            public void valueChanged(ListSelectionEvent e){
                if(!e.getValueIsAdjusting()){
                    jTTabelaLinhaSelecionada(jTTabelaProdutos);
                }
            }
        });

Ontem eu configurei o ambiente do java no Windows pensando que era alguma biblioteca que nao estava sendo carregada quando executo o .jar.
A tabela ainda insiste em nao funcionar quando executo direto pelo “.jar”, mas quando executo o programa pelo NetBeans, td funciona corretamente.

Mais alguma dica, por favor… ehhehehe.

Obrigado,
Ricardo.

Como você está criando este “jar”?

Clica com o Botão direito do mouse sobre o Projeto e “Limpar e Contruir”?

Bom dia tondatto…
Isso mesmo cara, eu clico no botão limpar e contruir da IDE (figura com martelinho e a vassoura) ou clico “shift + F11”…, vejo que ele constroi o projeto com sucesso, fecho a IDE, dai eu vou na pasta onde esta salvo o projeto…“C:\Users\Ricardo\Documents\NetBeansProjects\Controle_Estoque\dist” e la esta o pojeto com a extensão “.jar”.
Dou duplo clique nele, ele carrega as telas do projeto mas nao carrega a tabela que deveria aparecer a lista dos produtos em estoque.
So tem um void main no projeto todo…

public static void main(String[] args) throws SQLException { jTLogin menu1; new jTLogin().setVisible(true); } este chama a tela de login que por sua vez carrega a tela do menu principal que ai sim chama a tela de produtos em estoque onde fica a jTable.
Pelo NetBeans tudo funciona corretamente, mas quando executo pelo “.jar” que é o arquivo executavel que eu tenho que entregar este para o professor analisar o meu projeto, por este executavel nao funciona a jTable.
Este é um trabalho da faculdade e creio que tenho que entregar o executavel pra ele rodar na maquina dele. Não posso entregar o fonte e pedir que ele rode em alguma IDE pois o foco do projeto é desenvolver um aplicativo que rode na plataforma java. Como nao conheco JSP, resolvi fazer para aplicação desktop.

Obrigado,
Ricardo.

Ricardo, será que não tem a ver com conflito de JVM no seu computador? Você tem mais de uma versão do Java instalada?
Para ver, no Netbeans, veja em Ferramentas > Plataformas Java

Olá tondatto…
No gerenciador de plataforma Java tem na pasta J2SE apenas uma versão… JDK 1.7(Padrão).
Na aba Classes tem 14 Classpath, na aba Código-fonte nao tem nada e na aba Javadoc tem “http://download.oracle.com/javase/7/docs/api/

Obrigado,
Ricardo.

Ricardo,

Execute o jar através do console/shell:

E veja se alguma exception é disparada.

Olá tondatto…
Cara fiz o que vc me pediu e gerou varias exeções…

C:\Users\Ricardo\Documents\NetBeansProjects\Controle_Estoque\dist>java -jar Cont
role_Estoque.jar
Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: Cantinho_
BLZ/DAO/Produto_DAO
        at Cantinho_Blz.forms.jTProdutos.listarProdutos(jTProdutos.java:606)
        at Cantinho_Blz.forms.jTProdutos.jBPesquisarProdutoActionPerformed(jTProdutos.java:656)
        at Cantinho_Blz.forms.jTProdutos.access$000(jTProdutos.java:28)
        at Cantinho_Blz.forms.jTProdutos$1.actionPerformed(jTProdutos.java:124)
        at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
        at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
        at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
        at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
        at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
        at java.awt.Component.processMouseEvent(Unknown Source)
        at javax.swing.JComponent.processMouseEvent(Unknown Source)
        at java.awt.Component.processEvent(Unknown Source)
        at java.awt.Container.processEvent(Unknown Source)
        at java.awt.Component.dispatchEventImpl(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
        at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
        at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Window.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
        at java.awt.EventQueue.access$000(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
        at java.awt.EventQueue$4.run(Unknown Source)
        at java.awt.EventQueue$4.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: Cantinho_BLZ.DAO.Produto_DAO at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 41 more

As interfaces de Login, Menu Principal e Produtos carregaram sem problemas, mas quando eu cliquei no botão pesquisar para listar os produtos que eu tenho cadastrado em estoque, gerou esse monte de codigo que escrevi acima.

Sera que isso ajuda ?!?!?!?!

Obrigado,
Ricardo.

Sua exception está informando que a Classe Produto_DAO não foi encontrada.

O erro acontece na classe jTProdutos na linha 606, dentro do método listarProdutos.

Veja se o nome da classe está correto.

Olá tondatto…
Na linha 606 encontrei esse codigo abaixo…

public void listarProdutos() throws SQLException {
        Produto_DAO dao = new Produto_DAO();
        produtos = dao.Consulta_Estoque("%" + jTPesquisaProduto.getText() + "%");
        mostraPesquisa(produtos);
    }

Acho que deve estar correto… pois na classe Produto_DAO esta escrito da mesma forma que no frame jTProdutos… e ainda tenho os imports no proprio jFrame…

package Cantinho_Blz.forms;

import Cantinho_BLZ.DAO.Produto_DAO;
import Logica.Produto;
import java.sql.SQLException;
import java.util.List;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
...

Abaixo o codigo da classe Produto_DAO…

package Cantinho_BLZ.DAO;

import Cantinho_Blz.Banco_Dados.Cria_Conexao;
import Logica.Produto;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class Produto_DAO {

    private Connection conexao;
    
    public Produto_DAO() throws SQLException { //Metodo com o mesmo nome da classe;
        this.conexao = Cria_Conexao.getConexao();
    }
    
    public void adiciona(Produto p1) throws SQLException {
        //Prepara a Conexao com o banco de dados e carrega o codigo SQL em uma variavel;
        String sql = "insert into estoque (NM_PRODUTO,NM_FABRICANTE,DESCRICAO,QTDE,VLR_UNITARIO,"
                + "GENERO,DIA_DT_CADASTRO,MES_DT_CADASTRO,ANO_DT_CADASTRO,DIA_DT_FABRICACAO,"
                + "MES_DT_FABRICACAO,ANO_DT_FABRICACAO,DIA_DT_VALIDADE,MES_DT_VALIDADE,ANO_DT_VALIDADE)"
                + " values (?,?,?,?,?,?,DAY(SYSDATE()),MONTH(SYSDATE()),YEAR(SYSDATE()),?,?,?,?,?,?)";
        PreparedStatement stmt = conexao.prepareStatement(sql);
        //Seta os valores dos campos:
        stmt.setString(1, p1.getNM_PRODUTO());
        stmt.setString(2, p1.getNM_FABRICANTE());
        stmt.setString(3, p1.getDESCRICAO());
        stmt.setInt(4, p1.getQTDE());
        stmt.setFloat(5, p1.getVLR_UNITARIO());
        stmt.setString(6, p1.getGENERO());
        stmt.setInt(7, p1.getDIA_DT_FABRICACAO());
        stmt.setInt(8, p1.getMES_DT_FABRICACAO());
        stmt.setInt(9, p1.getANO_DT_FABRICACAO());
        stmt.setInt(10, p1.getDIA_DT_VALIDADE());
        stmt.setInt(11, p1.getMES_DT_VALIDADE());
        stmt.setInt(12, p1.getANO_DT_VALIDADE());
        //Executa o codigo SQL;
        stmt.execute();
        stmt.close();
    }
    //Metodo Pesquisa de Dados com ResultSet (Ponteiros no Banco de Dados (next)):
    //Vai retornar uma lista de produtos que tem no Banco de Dados:
    public List<Produto> Consulta_Estoque(String nomeProduto) throws SQLException {
        //Comando executavel no banco de dados:
        String sql = "select * from estoque where NM_PRODUTO like ?";
        PreparedStatement stmt = this.conexao.prepareStatement(sql);
        stmt.setString(1, nomeProduto);
        //ResultSet:
        ResultSet rs = stmt.executeQuery();
        //Guardar os resultados do ResultSet (ArrayList):
        List<Produto> minhaLista = new ArrayList<Produto>();
        while (rs.next()) {//Enquanto existe proximo, carrega a lista de produtos:
            Produto p1 = new Produto();
            p1.setID_PRODUTO(rs.getInt("ID_PRODUTO"));
            p1.setNM_PRODUTO(rs.getString("NM_PRODUTO"));
            p1.setNM_FABRICANTE(rs.getString("NM_FABRICANTE"));
            p1.setDESCRICAO(rs.getString("DESCRICAO"));
            p1.setQTDE(rs.getInt("QTDE"));
            p1.setVLR_UNITARIO(rs.getFloat("VLR_UNITARIO"));
            p1.setGENERO(rs.getString("GENERO"));
            p1.setDIA_DT_CADASTRO(rs.getInt("DIA_DT_CADASTRO"));
            p1.setMES_DT_CADASTRO(rs.getInt("MES_DT_CADASTRO"));
            p1.setANO_DT_CADASTRO(rs.getInt("ANO_DT_CADASTRO"));
            p1.setDIA_DT_FABRICACAO(rs.getInt("DIA_DT_FABRICACAO"));
            p1.setMES_DT_FABRICACAO(rs.getInt("MES_DT_FABRICACAO"));
            p1.setANO_DT_FABRICACAO(rs.getInt("ANO_DT_FABRICACAO"));
            p1.setDIA_DT_VALIDADE(rs.getInt("DIA_DT_VALIDADE"));
            p1.setMES_DT_VALIDADE(rs.getInt("MES_DT_VALIDADE"));
            p1.setANO_DT_VALIDADE(rs.getInt("ANO_DT_VALIDADE"));
            minhaLista.add(p1);
        }
        rs.close();
        stmt.close();
        return minhaLista;
    }

    public void altera(Produto p1) throws SQLException {
        String sql = "update estoque set NM_PRODUTO = ?,NM_FABRICANTE = ?,DESCRICAO = ?,QTDE = ?,VLR_UNITARIO = ?,"
                + "GENERO = ?,DIA_DT_CADASTRO = DAY(SYSDATE()),MES_DT_CADASTRO = MONTH(SYSDATE()),"
                + "ANO_DT_CADASTRO = YEAR(SYSDATE()),DIA_DT_FABRICACAO = ?,MES_DT_FABRICACAO = ?,"
                + "ANO_DT_FABRICACAO = ?,DIA_DT_VALIDADE = ?,MES_DT_VALIDADE = ?,ANO_DT_VALIDADE = ? "
                + "where ID_PRODUTO = ?";
        PreparedStatement stmt = conexao.prepareStatement(sql);
        //Seta os valores dos campos:
        stmt.setString(1, p1.getNM_PRODUTO());
        stmt.setString(2, p1.getNM_FABRICANTE());
        stmt.setString(3, p1.getDESCRICAO());
        stmt.setInt(4, p1.getQTDE());
        stmt.setFloat(5, p1.getVLR_UNITARIO());
        stmt.setString(6, p1.getGENERO());;
        stmt.setInt(7, p1.getDIA_DT_FABRICACAO());
        stmt.setInt(8, p1.getMES_DT_FABRICACAO());
        stmt.setInt(9, p1.getANO_DT_FABRICACAO());
        stmt.setInt(10, p1.getDIA_DT_VALIDADE());
        stmt.setInt(11, p1.getMES_DT_VALIDADE());
        stmt.setInt(12, p1.getANO_DT_VALIDADE());
        stmt.setInt(13, p1.getID_PRODUTO());        
        //Executa o codigo SQL;
        stmt.execute();
        stmt.close();
    }

    public void remove(Produto p1) throws SQLException {
        String sql = "delete from estoque where ID_PRODUTO = ?";
        PreparedStatement stmt = conexao.prepareStatement(sql);
        stmt.setInt(1, p1.getID_PRODUTO());
        //Executa a Query no banco de dados;
        stmt.execute();
        stmt.close();
    }
}

Acima temos o CRUD, ou seja, todo o codigo da classe Produto_DAO esta ai.

Obrigado,
Ricardo.

Ricardo, vamos ver…

O erro está dando porque o Java não acha sua classe Produto_DAO do pacote Cantinho_BLZ.DAO.
Será que pode estar acontecendo algum conflito com o nome do pacote, pois a classe Produto_DAO está no pacote cuja parte do nome do pacote “Cantinho_Blz” está escrito todo em maiúsculo “BLZ”, e na outra classe que você mostrou apenas o ‘B’ em minúsculo.

Eu sugiro você a Renomear o nome do pacote para que todos fiquem padronizados nas partes em comum.

Olá tondatto…
Cara, como eu posso te agradecer ???
Tem algum “ranking” no blog que eu posso estar avaliando a sua ajuda, persistencia e inteligencia ???
Funfou o que vc disse pra fazer… era aquilo mesmo que estava acontecendo.
Mas so uma pergunta… não deveria dar erro por ter essa diferenca no nome… pois como todos sabemos o java é “Case Sensitive” e isso nao deveria dar erro na hora de compilar ???

Mais uma vez obrigado cara. Vc salvou o meu TCC… ehhehehehehe.
Me diga como eu posso te agradecer blz ?!?!?!?!?!?!

Mais uma vez, obrigado.
Ricardo.