[Resolvido] JTable & MySQL (das 07:10 às 16:47). Tá na hora de pedir ajuda!

6 respostas
ronaldoo

Olá pessoal,
Estou tentando como digo no título do post a muitas horas. Já tentei com o tutorial aqui do GUJ e com tantos outros da internet, mas não estou conseguindo.
Minha intenção é pegar os dados do meu banco de dados MySQL e mostrá-los no meu JTable. Não dá erro na hora de compilar, mas quando eu executo o método a tabela fica toda cinza (tipo desativada) e não mostra nada... Apenas redimenciona as colunas.
Agradeço qualquer ajuda, meu código é o seguinte:

public void preencher_jtable() {
        TabelaClientes.getColumnModel().getColumn(0).setPreferredWidth(20);
        TabelaClientes.getColumnModel().getColumn(1).setPreferredWidth(150);
        TabelaClientes.getColumnModel().getColumn(2).setPreferredWidth(20);

        DefaultTableModel modelo = (DefaultTableModel) TabelaClientes.getModel();
        modelo.setNumRows(0);

        try {
            bancoLocadora.conecta();
            rs = bancoLocadora.stmt.executeQuery("SELECT * FROM CLIENTES");
            while (bancoLocadora.rs.next()) {
                modelo.addRow(new Object[]{bancoLocadora.rs.getString("CODIGO_CLIENTE"), bancoLocadora.rs.getString("NOME_CLIENTE"), bancoLocadora.rs.getString("CPF_CLIENTE"), bancoLocadora.rs.getString("RG_CLIENTE")});
            }
            bancoLocadora.rs.first();
        } catch (SQLException erro) {
            JOptionPane.showMessageDialog(null, "Erro ao listar no JTable " + erro);
        }
    }
[color=red]---------------------------------------------------------------------------------- Resolvido. Código da solução está logo abaixo. Obrigado a todos! ViniGodoy: Só consegui com o Default cara... Quais problemas podem ocorrer - ou limitações - se eu continuar usando ele? Se quiser continuar me ajudando, eu quero muito aprender a fazer do jeito certo!

Código:[/color]

public void eu_preencho_a_tabela() {
        bancoLocadora.conecta();
        TabelaClientes.getColumnModel().getColumn(0).setPreferredWidth(20);
        TabelaClientes.getColumnModel().getColumn(1).setPreferredWidth(150);
        TabelaClientes.getColumnModel().getColumn(2).setPreferredWidth(20);

        DefaultTableModel modelo = (DefaultTableModel) TabelaClientes.getModel();
        modelo.setNumRows(0);
        try {
            rs = bancoLocadora.stmt.executeQuery("SELECT * FROM CLIENTES");
            while (rs.next()) {
                modelo.addRow(new Object[]{
                            rs.getString("CODIGO_CLIENTE"),
                            rs.getString("NOME_CLIENTE"),
                            rs.getString("CPF_CLIENTE"),
                            rs.getString("RG_CLIENTE"),
                        });
            }
            bancoLocadora.desconecta();
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, e);
            limpar();
        }
    }

6 Respostas

E
Esta e a minha esta funcionando, talvez o seu problema e na busca do banco.

public void consultaNotafiscal()

{

jTable2.getColumnModel( ).getColumn(0).setPreferredWidth(20);

jTable2.getColumnModel( ).getColumn(1).setPreferredWidth(10);

jTable2.getColumnModel( ).getColumn(2).setPreferredWidth(10);

jTable2.getColumnModel( ).getColumn(3).setPreferredWidth(40);

jTable2.getColumnModel( ).getColumn(4).setPreferredWidth(10);

jTable2.getColumnModel( ).getColumn(5).setPreferredWidth(10);

DefaultTableModel modelo = (DefaultTableModel)jTable2.getModel();

modelo.setNumRows(0);

try

{

String lista =SELECT * FROM notafiscal; // WHERE numero_nt =’"+tfPesquisa.getText()+"’";

pstm = banco.conectar().prepareStatement(lista);

rs = pstm.executeQuery();

while (rs.next())

modelo.addRow(new Object[ ]

{

rs.getString(numero_nt),

rs.getString(codigo_for),

rs.getString(codigo_prod),

rs.getString(preco_prod),

rs.getString(qtd_prod),

rs.getString(total_nt)

});

}

catch(SQLException erro){}

finally{

banco.desconectar();

}

}
ViniGodoy

ronaldoo, pode colocar o código todo do seu JFrame?

Só uma dica, já de antemão.
Não use o DefaultTableModel. A JTable não foi feita para ser usada desse jeito.
Essa classe serviu somente de exemplo, na prática, monte seu próprio model.

Os artigos abaixo ensinam a fazer isso:
http://www.informit.com/articles/article.aspx?p=332278
http://www.informit.com/articles/article.aspx?p=333472

Erisvaldo, quando postar códigos, por favor, use a tag code. Se ainda não sabe fazer isso, dá uma lida nesse link:
http://www.guj.com.br/posts/list/50115.java

Fica difícil ler o seu código sem as tags. :wink:

ronaldoo
<blockquote><div class="quote-author">erisvaldo_anjos:</div>Esta e a minha esta funcionando, talvez o seu problema e na busca do banco.

public void consultaNotafiscal()

{

jTable2.getColumnModel( ).getColumn(0).setPreferredWidth(20);

jTable2.getColumnModel( ).getColumn(1).setPreferredWidth(10);

jTable2.getColumnModel( ).getColumn(2).setPreferredWidth(10);

jTable2.getColumnModel( ).getColumn(3).setPreferredWidth(40);

jTable2.getColumnModel( ).getColumn(4).setPreferredWidth(10);

jTable2.getColumnModel( ).getColumn(5).setPreferredWidth(10);

DefaultTableModel modelo = (DefaultTableModel)jTable2.getModel();

modelo.setNumRows(0);

try

{

String lista =“SELECT * FROM notafiscal”; // WHERE numero_nt =’"+tfPesquisa.getText()+"’";

pstm = banco.conectar().prepareStatement(lista);

rs = pstm.executeQuery();

while (rs.next())

modelo.addRow(new Object[ ]

{

rs.getString(numero_nt),

rs.getString(codigo_for),

rs.getString(codigo_prod),

rs.getString(preco_prod),

rs.getString(qtd_prod),

rs.getString(total_nt)

});

}

catch(SQLException erro){}

finally{

banco.desconectar();

}

}

</blockquote>

erisvaldo_anjos: Tentei implementar isso que você falou mas dá uma carrada de erros. Seguem eles:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 4 >= 4 at java.util.Vector.elementAt(Vector.java:427) at javax.swing.table.DefaultTableColumnModel.getColumn(DefaultTableColumnModel.java:277) at jifClientes.consultaNotafiscal(jifClientes.java:722) at jifClientes.bCancelarClientesActionPerformed(jifClientes.java:577) at jifClientes.access$500(jifClientes.java:18) at jifClientes$6.actionPerformed(jifClientes.java:179) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) at java.awt.Component.processMouseEvent(Component.java:6041) at javax.swing.JComponent.processMouseEvent(JComponent.java:3265) at java.awt.Component.processEvent(Component.java:5806) at java.awt.Container.processEvent(Container.java:2058) at java.awt.Component.dispatchEventImpl(Component.java:4413) at java.awt.Container.dispatchEventImpl(Container.java:2116) at java.awt.Component.dispatchEvent(Component.java:4243) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916) at java.awt.Container.dispatchEventImpl(Container.java:2102) at java.awt.Window.dispatchEventImpl(Window.java:2440) at java.awt.Component.dispatchEvent(Component.java:4243) at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160) at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

ViniGodoy: Vou verificar estes links agora depois do banho, mas já estou indo meio desanimado cara… Não consigo compreender o X da questão! :confused:
Em breve posto a boa ou má novidade, obrigado a vocês dois!

ronaldoo

ViniGodoy: Li os tutoriais. Consegui fazer mostrar os dados finalmente (ainda insistindo no DefaultTableModel…)!!! Mas aconteceu algo muito estranho, mostrou uma vez, e agora todo meu formulário não está editável, vê se pode uma coisa dessas… Amanhã vou dar uma analisada para ver onde está dando bug no código.
Obrigado mais uma vez pela ajuda - espero conseguir compreender direito aquele tutorial amanhã… Agora vou dormir porque estou acabado. Boa noite! :wink:

ronaldoo

ViniGodoy:
ronaldoo, pode colocar o código todo do seu JFrame?

Só uma dica, já de antemão.
Não use o DefaultTableModel. A JTable não foi feita para ser usada desse jeito.
Essa classe serviu somente de exemplo, na prática, monte seu próprio model.

Os artigos abaixo ensinam a fazer isso:
http://www.informit.com/articles/article.aspx?p=332278
http://www.informit.com/articles/article.aspx?p=333472

Erisvaldo, quando postar códigos, por favor, use a tag code. Se ainda não sabe fazer isso, dá uma lida nesse link:
http://www.guj.com.br/posts/list/50115.java

Fica difícil ler o seu código sem as tags. ;)

Certo [color=blue]ViniGodoy[/color], li mais de uma vez esses artigos. Mas não consegui pegar o fio da meada.
Não há um meio mais fácil de pegar (enquanto aguardo a resposta estou continuando a testar) os dados do MySQL e jogá-los numa variável ou vetor e depois exibí-los na JTable, ou até mesmo exibí-los direto sem armazenagem em tempo de execução?
Cara, tô me sentindo um imbecil com essas dúvidas mas quero muito aprender isso - e da maneira certa; como você mencionou não é bom usar o default, e eu estava tentando aprender usar justo ele… De qualquer forma ainda não deu certo. Você poderia me dar mais alguma dica ou link ?
Muito obrigado mais uma vez, um abraço.

ronaldoo

Pronto galera, consegui exibir os dados que tanto queria! Muito obrigado a todos vocês!
ViniGodoy: Só consegui com o Default cara... :( Quais problemas podem ocorrer - ou limitações - se eu continuar usando ele? Se quiser continuar me ajudando, eu quero muito aprender a fazer do jeito certo!
Segue abaixo o código finalizado para tal:

public void eu_preencho_a_tabela() {
        bancoLocadora.conecta();
        TabelaClientes.getColumnModel().getColumn(0).setPreferredWidth(20);
        TabelaClientes.getColumnModel().getColumn(1).setPreferredWidth(150);
        TabelaClientes.getColumnModel().getColumn(2).setPreferredWidth(20);

        DefaultTableModel modelo = (DefaultTableModel) TabelaClientes.getModel();
        modelo.setNumRows(0);
        try {
            rs = bancoLocadora.stmt.executeQuery("SELECT * FROM CLIENTES");
            while (rs.next()) {
                modelo.addRow(new Object[]{
                            rs.getString("CODIGO_CLIENTE"),
                            rs.getString("NOME_CLIENTE"),
                            rs.getString("CPF_CLIENTE"),
                            rs.getString("RG_CLIENTE"),
                        });
            }
            bancoLocadora.desconecta();
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, e);
            limpar();
        }
    }
Criado 13 de julho de 2008
Ultima resposta 21 de jul. de 2008
Respostas 6
Participantes 3