Problemas na Atualização da JTable

11 respostas
Diego.G.A

Seguinte to criando uma agenda para fins de aprendizado.
Só esta acontecendo um erro, quando tento atualizar os dados que estão listados na minha JTable.
o Processo do programa é o seguinte:
1 -> inserir os dados
2 -> faz busca no banco
3 -> adiciona os dados na JTable

Só que nesse terceiro passo ele provoca uma Exception.
O código é:

package acoes;

import java.sql.ResultSetMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import db.ConnectionDB;
import db.Constantes;
import javax.swing.table.DefaultTableModel;
import javax.swing.JTable;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import java.util.Formatter;

public class GerenciaContato {

    private String nome = null;
    private String email = null;
    private String endereco = null;
    private String telefone = null;
    private String celular = null;
    private ConnectionDB connectionDB;
    private ResultSetMetaData dados;
    private JTable tabela;
    private JLabel textoResposta;
    private ResultSet resultado;
    
    // <editor-fold defaultstate="collapsed" desc="Método set's e get's">
    public void setNome(String nome) {
        this.nome = nome;
    }
    
    public void setEmail(String email) {
        this.email = email;
    }
    
    public void setEndereco(String endereco) {
        this.endereco = endereco;
    }
    
    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }
    
    public void setCelular(String celular) {
        this.celular = celular;
    }
    
    public void setTabela(JTable tabela) {
        this.tabela = tabela;
    }
    
    public String getNome() {
        return nome;
    }
    
    public String getEmail() {
        return email;
    }
    
    public String getEndereco() {
        return endereco;
    }
    
    public String getTelefone() {
        return telefone;
    }
    
    public String getCelular() {
        return celular;
    }
    
    private JTable getTabela() {
        return tabela;
    }
    // </editor-fold>
    
    public GerenciaContato(JTable tabela, JLabel textoResposta) {
        this.textoResposta = textoResposta;
        setTabela(tabela);
        busca();
    }
    
    private void limpaBuffer() {
        nome = null;
        email = null;
        endereco = null;
        telefone = null;
        celular = null;
        connectionDB = null;
        dados = null;
        tabela = null;
        resultado = null;
    }
    
    public void inseri() {
        connectionDB = new ConnectionDB();
        String sql = "INSERT INTO contatos " +
                "(Nome, Email, Endereco, Telefone, Celular) VALUES " +
                "('"+ nome +"', '"+ email +"', '"+ endereco +"', '"+ telefone +"', '"+ celular +"')";
        connectionDB.update(sql);
        limpaBuffer();
        busca();
    }
    
    public void busca() {
        boolean where = false;
        String sql = "SELECT * FROM contatos ";
        if(nome != null) {
            sql += "WHERE Nome LIKE '%"+ nome +"%'";
            where = true;
        }
        if(email != null) {
            if(where)
                sql += "WHERE ";
            else
                sql += " AND ";
            sql += " Email LIKE '%"+ email +"%'";
            where = true; 
        }
        if(endereco != null) {
            if(where)
                sql += "WHERE ";
            else
                sql += " AND ";
            sql += " Endereco LIKE '%"+ email +"%'";
            where = true; 
        }
        if(telefone != null) {
            if(where)
                sql += "WHERE ";
            else
                sql += " AND ";
            sql += " Telefone LIKE '%"+ email +"%'";
            where = true; 
        }
        if(celular != null) {
            if(where)
                sql += "WHERE ";
            else
                sql += " AND ";
            sql += " Celular LIKE '%"+ email +"%'";
            where = true; 
        }
        try {
            connectionDB = new ConnectionDB();
            connectionDB.query(sql);
            dados = connectionDB.getDados();
            resultado = connectionDB.getResultados();
        } catch (Exception exception) {
            JOptionPane.showMessageDialog(null, Constantes.ERRO_PADRAO,
                    "Erro", JOptionPane.ERROR_MESSAGE);
        }
        showTable();
    } // fim do método de busca

    // método que exibe os valores da pesquisa na JTable
    private void showTable() {
        try {
            Object[][] objDados = new Object[connectionDB.getRow()][6];
            int i = 0;
            int numeroColunas = dados.getColumnCount();
            if(numeroColunas != 0) {
                while(resultado.next()) {
                    for(int count=0;count<numeroColunas;i++)
                        objDados[i][count] = resultado.getObject(count + 1);
                }
            }
            textoResposta.setText("Foram encontrados ("+ connectionDB.getRow() +") resultados:");
            String[] campos = {"ID","Nome","Email","Endereco","Telefone","Celular"};
            DefaultTableModel modeloPadrao = new DefaultTableModel(objDados, campos);
            tabela.setModel(modeloPadrao);
        } catch (SQLException exception) {
            JOptionPane.showMessageDialog(null, Constantes.ERRO_PADRAO +"\nError: "+ exception.getMessage(),
                    "Erro", JOptionPane.ERROR_MESSAGE);
        } finally {
            connectionDB.closingConnection();
        }
        limpaBuffer();
    } // fim do método showTable
    
}

11 Respostas

ViniGodoy

Repetindo a ladainha de sempre. Não use o DefaultTableModel
No lugar, crie seu proprio TableModel, filho de AbstractTableModel.

Esses dois links te ajudarão nessa tarefa:
http://www.informit.com/articles/article.aspx?p=332278
http://www.informit.com/articles/article.aspx?p=333472

E esse exemplo também:
http://www.guj.com.br/posts/list/98452.java

fantomas

Você não incluiu no seu post a pilha do erro e nem a mensagem para facilitar sua descoberta.

Utilize System.out.println(exception.printStackTrace()) ; para obter esta pilha.

flws

ViniGodoy

Ah sim. Se você tem uma exception, não esqueça de dizer qual exception é e em que linha ela ocorre.

Senão fica realmente difícil te responder.

Diego.G.A

A pilha de Exception é essa.

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at acoes.GerenciaContato.showTable(GerenciaContato.java:172) at acoes.GerenciaContato.busca(GerenciaContato.java:154) at acoes.GerenciaContato.inseri(GerenciaContato.java:103) at agenda.AgendaContatosView.efetuaCadastro(AgendaContatosView.java:367) at agenda.AgendaContatosView.access$800(AgendaContatosView.java:26) at agenda.AgendaContatosView$4.actionPerformed(AgendaContatosView.java:196) 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)

janjan

pra encher minha tabela faço assim

st = conexao.createStatement();
            rs = st.executeQuery("select * from ESTADOS order by NOMEESTADO");
            
            Vector cabecalho = new Vector();
            cabecalho.addElement("Sigla");
            cabecalho.addElement("Estado");
            
            Vector linhas = new Vector();
            Vector colunas = new Vector();
            while (rs.next()) {
                colunas.removeAllElements();
                colunas.addElement(rs.getString("SIGLA"));//aqui eh o nome do campo da tabela
                colunas.addElement(rs.getString("NOMEESTADO"));//nome campo da tabela
                
                linhas.add(new Vector(colunas));
            }
            
            tbDados.setModel(new javax.swing.table.DefaultTableModel(linhas, cabecalho));

sempre funciona!

fantomas

Dá uma olhada na linha 172, lá tem o atributo tabela (JTable) me parece que ele não foi inicializado, porisso a jvm envia a exception quando tenta utilizar o método setModel.

flws.

Diego.G.A

valeu ele funciono, mas tem um outro problema, ele não mostra os valores na tabela, so lista a quantidade de registros cadastrado.
e sobre a linha 172, é que quando eu faço a inserção dos novos dados eu chamo o método limpaBuffer,
e era ele que tava passando o valor de null para a variavel tabela

ViniGodoy

Já leu os atigos e viu o exemplo que passei?

Vai por mim, insistir no DefaultTableModel é perda de tempo, é aumentar a complexidade do software a toa e é fazer um trabalho muito, muito pouco profissional.

Diego.G.A

blz eu vou ler ele, no meu livro diz para usar essa classe também

fantomas

Então…

DEPOIS desta linha tabela.setModel(modeloPadrao); execute o seguinte: modeloPadrao.fireTableDataChanged();

Isso vai fazer com que a view da grid seja refeita (ao menos essa é a idéia).

Certifique-se de que o array objDados tem conteúdo.

flws

fantomas

Ah… já ia me esquecendo de outra dica: siga as dicas do ViniGodoy.

flws

Criado 4 de novembro de 2008
Ultima resposta 4 de nov. de 2008
Respostas 11
Participantes 4