Como atualizar uma JTable depois de inserir um registro no banco de dados?

Estou tentando a horas, pesquisando toda idéia que aparece, todos os caminhos indicados, mas nada de atualizar a tabela. já até consegui limpar a tabela [setRowCount=0], mas não conseguir escrever a query de volta. Deixe-me explicar com calma.

Eu tenho uma classe que exibe uma tabela de um banco de dados quando é chamada. Na interface desta tabela eu coloquei botões para adicionar, deletar, atualizar e procurar registros.

Contudo quando uso o botão para adicionar o registro eu consigo adicionar no banco de dados a nova linha, mas não consigo atualizar a tabela para mostrar no novo registro.

Estou aprendendo ainda, então eu peguei códigos aki e ali para montar o programa, são 5 classes que estão tirando meu sono…

classe de conexão:

[code]/**

package escola;

import java.sql.;
import java.io.
;

public class ConexaoDB {

public Connection con;
FileInputStream fi;
BufferedReader buff;
String line = "";
String[] lines = new String[30];
int i = 0;

public ConexaoDB() {
    try {
        fi = new FileInputStream("/home/luciano/Documentos/java/xls/db.conf");
        buff = new BufferedReader(new InputStreamReader(fi));
        i = 0;
        while ((line = buff.readLine()) != null) {
            lines[i] = line;
            i++;
        }
        String host = lines[1].trim();
        String baseDeDados = lines[3].trim();
        String usuario = lines[5].trim();
        String senha = lines[7].trim();
        con = DriverManager.getConnection("jdbc:mysql://" + host + "/" + baseDeDados, usuario, senha);
    } catch (Exception erro1) {
        System.out.println("Erro de arquivo - " + erro1);
    }
}

}[/code]

Classe da Tabela Modelo:

[code]/**

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.table.AbstractTableModel;

public class TabelaModelo extends AbstractTableModel {

private ConexaoDB conexao;
private Statement instrucao;
private ResultSet rs;
private ResultSetMetaData metaData;
private int numberOfRows;

public TabelaModelo(String busca) throws SQLException {
    conexao = new ConexaoDB(); // conecta-se ao banco de dados
    instrucao = conexao.con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); // cria Statement para consultar banco de dados
    setQuery(busca); // configura consulta e a executa
} // fim do construtor TabelaModelo 

@Override    // obtém a classe que representa o tipo de coluna
public Class getColumnClass(int column) throws IllegalStateException {
    // determina a classe Java de coluna
    try {
        String className = metaData.getColumnClassName(column + 1);
    } catch (Exception erro1) {
        System.out.println("Erro ao pegar a classe - " + erro1);
    }
    return Object.class; // se ocorrerem os problemas acima, assume tipo Object
} // fim do método getColumnClass 

@Override    // obtém número de colunas em ResultSet
public int getColumnCount() throws IllegalStateException {
    // determina número de colunas
    try {
        return metaData.getColumnCount();
    } catch (SQLException erro2) {
        System.out.println("Erro ao contar colunas - " + erro2);
    }
    return 0; // se ocorrerem os problemas acima, retorna 0 para o número de colunas
} // fim do método getColumnCount 

@Override    // obtém nome de uma coluna particular em ResultSet
public String getColumnName(int column) throws IllegalStateException {
    // determina o nome de coluna
    try {
        return metaData.getColumnName(column + 1);
    } // fim do try
    catch (SQLException erro3) {
        System.out.println("Erro ao pegar nome de coluna - " + erro3);
    } // fim do catch
    return ""; // se ocorrerem problemas, retorna string vazia para nome de coluna
} // fim do método getColumnName

@Override    // retorna número de linhas em ResultSet
public int getRowCount() throws IllegalStateException {
    return numberOfRows;
} // fim do método getRowCount 

@Override // obtém valor na linha e coluna particular
public Object getValueAt(int row, int column) throws IllegalStateException {
    // obtém um valor na linha e coluna de ResultSet especificada 
    try {
        rs.absolute(row + 1);
        return rs.getObject(column + 1);
    } catch (SQLException erro4) {
        System.out.println("Erro ao pegar valores - " + erro4);
    }
    return ""; // se ocorrerem problemas, retorna objeto string vazio
} // fim do método getValueAt 

// configura nova string de consulta de banco de dados
public final void setQuery(String query) throws SQLException, IllegalStateException {
    // especifica consulta e a executa
    rs = instrucao.executeQuery(query);
    // obtém metadados para ResultSet
    metaData = rs.getMetaData();
    // determina o número de linhas em ResultSet
    rs.last(); // move para a última linha
    numberOfRows = rs.getRow();  // obtém número de linha
    // notifica a JTable de que modelo foi alterado
    fireTableStructureChanged();
} // fim do método setQuery 

public final void setRowCount() {
    //zera as linhas
    numberOfRows = 0;
    fireTableStructureChanged(); // notifica a JTable de que modelo foi alterado
}

// fecha Statement e Connection
public void disconnectFromDatabase() {
    // fecha Statement e Connection
    try {
        instrucao.close();
        conexao.con.close();
    } catch (SQLException erro5) {
        System.out.println("Erro ao desconectar - " + erro5);
    }
} // fim do método disconnectFromDatabase 

} // fim da classe TabelaModelo [/code]

Classe da interface principal:

[code]package escola;

import java.awt.Font;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;

/**

  • @author Luciano Santos

  • @site www.analisedesistemas.wordpress.com
    */
    public class GUIEscola extends JFrame {

    private JLabel lblTitulo, lblRodape, lblFuncionarios;
    private JButton btnAlunoAdd, btnAlunoDel, btnAlunoUp, btnAlunoSearch, btnFuncionariosAdd, btnFuncionariosDel, btnFuncionariosUp, btnFuncionariosSearch, btnExit;
    private JPanel pnlAlunos, pnlFuncionarios;
    private JScrollPane scrollAlu, scrollFun;
    private JTable tblAlunos, tblFuncionarios;
    static final String CONSULTA_PADRAO = "SELECT * FROM alunos ORDER BY Nome";
    private ConexaoDB conexao;
    public TabelaModelo modelo, modelo2;

    private void montarTela() {
    lblTitulo = new JLabel("Escola v1.0");
    lblTitulo.setBounds(280, 0, 120, 24);
    add(lblTitulo);

     ImageIcon icon = (null);
     JTabbedPane pnlAba = new JTabbedPane();
     pnlAba.setBounds(0, 0, 720, 340);
     add(pnlAba);
     pnlAlunos = new JPanel();
     pnlAlunos.setLayout(null);
     pnlAba.addTab("Alunos", icon, pnlAlunos, "Consulte, adicione ou exclua alunos");
    
     selAluno();
    
     scrollAlu = new JScrollPane(tblAlunos);
     scrollAlu.setBounds(10, 10, 600, 290);
     pnlAlunos.add(scrollAlu);
     pnlFuncionarios = new JPanel();
     pnlFuncionarios.setLayout(null);
     pnlAba.addTab("Funcionarios", icon, pnlFuncionarios, "Consulte, adicione ou exclua funcionarios");
    
     selFuncionario();
    
     scrollFun = new JScrollPane(tblFuncionarios);
     scrollFun.setBounds(10, 10, 600, 290);
     pnlFuncionarios.add(scrollFun);
    
     btnAlunoAdd = new JButton("Adicionar");
     btnAlunoAdd.setBounds(620, 20, 75, 20);
     btnAlunoAdd.setFont(new Font("Sans-serif", Font.PLAIN, 12));
     btnAlunoAdd.setMargin(new Insets(0, 0, 0, 0));
     pnlAlunos.add(btnAlunoAdd);
    
     btnAlunoDel = new JButton("Deletar");
     btnAlunoDel.setBounds(620, 50, 75, 20);
     btnAlunoDel.setFont(new Font("Sans-serif", Font.PLAIN, 12));
     btnAlunoDel.setMargin(new Insets(0, 0, 0, 0));
     pnlAlunos.add(btnAlunoDel);
    
     btnAlunoUp = new JButton("Corrigir");
     btnAlunoUp.setBounds(620, 80, 75, 20);
     btnAlunoUp.setFont(new Font("Sans-serif", Font.PLAIN, 12));
     btnAlunoUp.setMargin(new Insets(0, 0, 0, 0));
     pnlAlunos.add(btnAlunoUp);
    
     btnAlunoSearch = new JButton("Buscar");
     btnAlunoSearch.setBounds(620, 110, 75, 20);
     btnAlunoSearch.setFont(new Font("Sans-serif", Font.PLAIN, 12));
     btnAlunoSearch.setMargin(new Insets(0, 0, 0, 0));
     pnlAlunos.add(btnAlunoSearch);
    
     lblFuncionarios = new JLabel("Funcionarios", SwingConstants.CENTER);
     lblFuncionarios.setBounds(40, 160, 80, 26);
     lblFuncionarios.setBorder(BorderFactory.createEtchedBorder());
     pnlFuncionarios.add(lblFuncionarios);
    
     btnFuncionariosAdd = new JButton("Adicionar");
     btnFuncionariosAdd.setBounds(620, 20, 75, 20);
     btnFuncionariosAdd.setMargin(new Insets(0, 0, 0, 0));
     btnFuncionariosAdd.setFont(new Font("Sans-serif", Font.PLAIN, 12));
     pnlFuncionarios.add(btnFuncionariosAdd);
    
     btnFuncionariosDel = new JButton("Deletar");
     btnFuncionariosDel.setBounds(620, 50, 75, 20);
     btnFuncionariosDel.setMargin(new Insets(0, 0, 0, 0));
     btnFuncionariosDel.setFont(new Font("Sans-serif", Font.PLAIN, 12));
     pnlFuncionarios.add(btnFuncionariosDel);
    
     btnFuncionariosUp = new JButton("Atualizar");
     btnFuncionariosUp.setBounds(620, 80, 75, 20);
     btnFuncionariosUp.setMargin(new Insets(0, 0, 0, 0));
     btnFuncionariosUp.setFont(new Font("Sans-serif", Font.PLAIN, 12));
     pnlFuncionarios.add(btnFuncionariosUp);
    
     btnFuncionariosSearch = new JButton("Buscar");
     btnFuncionariosSearch.setMargin(new Insets(0, 0, 0, 0));
     btnFuncionariosSearch.setBounds(620, 110, 75, 20);
     btnFuncionariosSearch.setFont(new Font("Sans-serif", Font.PLAIN, 12));
     pnlFuncionarios.add(btnFuncionariosSearch);
    
     lblRodape = new JLabel("Criado por Luciano Santos", SwingConstants.CENTER);
     lblRodape.setBounds(10, 350, 260, 26);
     lblRodape.setBorder(BorderFactory.createEtchedBorder());
     add(lblRodape);
    
     btnExit = new JButton("Sair");
     btnExit.setBounds(275, 350, 102, 26);
     add(btnExit);
    

    }

    public final void selAluno() {
    try {
    modelo = new TabelaModelo(CONSULTA_PADRAO);
    } catch (SQLException erro1) {
    System.out.println("Erro ao pegar a classe - " + erro1);
    // assegura que a conexão de banco de dados está fechada
    modelo.disconnectFromDatabase();
    System.exit(1); // termina o aplicativo
    }
    tblAlunos = new JTable(modelo);
    tblAlunos.setBounds(10, 10, 600, 290);
    tblAlunos.setBorder(BorderFactory.createEtchedBorder());
    pnlAlunos.add(tblAlunos);
    }

    public final void selFuncionario() {

     try {
         modelo2 = new TabelaModelo("SELECT  * FROM funcionarios ORDER BY idFuncionario");
    
     } catch (SQLException erro2) {
         System.out.println("Erro ao fazer consulta - " + erro2);
         // assegura que a conexão de banco de dados está fechada
         modelo.disconnectFromDatabase();
         System.exit(1);   // termina o aplicativo
     }
     tblFuncionarios = new JTable(modelo2);
     tblFuncionarios.setBounds(10, 10, 600, 290);
     tblFuncionarios.setBorder(BorderFactory.createEtchedBorder());
     pnlFuncionarios.add(tblFuncionarios);
    

    }

    public class Sair implements ActionListener {

     @Override
     public void actionPerformed(ActionEvent ev) {
         dispose();
     }
    

    }

    GUIEscola() {
    setTitle("Escola v1.0");
    setSize(720, 420);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    setLayout(null);
    montarTela();
    try {
    conexao = new ConexaoDB();
    } catch (Exception erro3) {
    System.out.println("Erro de conexao" + erro3);
    }

     btnAlunoAdd.addActionListener(new AddAluno());
     btnAlunoDel.addActionListener(new DelAluno());
     btnExit.addActionListener(new Sair());
    

    }

    public class AddAluno implements ActionListener {
    addAluno tela;

     @Override
     public void actionPerformed(ActionEvent ev) {
         if (tela == null) {
             tela = new addAluno();
             modelo.setRowCount();
         }
         tela.setVisible(true);
     }
    

    }

    public class DelAluno implements ActionListener {

     @Override
     public void actionPerformed(ActionEvent ev) {
         String confirma = JOptionPane.showInputDialog("Digite o id do aluno a ser excluido.");
         try {
             // cria um preparedStatement
             PreparedStatement pStmt = conexao.con.prepareStatement("Delete from alunos where idAluno = (?)");
    
             // preenche os valores
             pStmt.setString(1, confirma);
    
             // executa
             pStmt.execute();
             pStmt.close();
             lblRodape.setText("Linha deletada");
    
             conexao.con.close();
    
         } catch (SQLException erro4) {
             System.out.println("Erro ao deletar - " + erro4);
             // assegura que a conexão de banco de dados está fechada
             modelo.disconnectFromDatabase();
             System.exit(1);   // termina o aplicativo
         }
     }
    

    }
    public static void main(String[] args) {
    GUIEscola exm = new GUIEscola();
    exm.setVisible(true);
    }
    }[/code]

Classe do botão adicionar:

[code]/**

import java.sql.ResultSet;
import java.sql.SQLException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.text.ParseException;
import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.text.MaskFormatter;

public class addAluno extends JFrame {

private JLabel lblRodape, lblIdAluno, lblNome, lblTelefone, lblMensalidade;
private JTextField txtIdAluno, txtNome, txtMensalidade;
private JButton btnIncluir;
private MaskFormatter mskTelefone;
private JFormattedTextField fTxtTelefone;

private ConexaoDB conexao;
private Statement instrucao;
private ResultSet rs;
private GUIEscola atual;
addAluno() {
    setTitle("Adicionar novo aluno");
    setSize(500, 120);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    setLayout(null);
    montarTela();
    setVisible(true);

    try {
        conexao = new ConexaoDB();
        instrucao = (Statement) conexao.con.createStatement();
    } catch (Exception exe) {
        System.out.println("Erro de conexao");
    }


}

private void montarTela() {

    lblIdAluno = new JLabel("idAluno");
    lblIdAluno.setBounds(10, 3, 100, 24);
    add(lblIdAluno);

    lblNome = new JLabel("Nome");
    lblNome.setBounds(85, 3, 180, 24);
    add(lblNome);

    lblTelefone = new JLabel("Telefone");
    lblTelefone.setBounds(275, 3, 120, 24);
    add(lblTelefone);

    lblMensalidade = new JLabel("Mensalidade");
    lblMensalidade.setBounds(390, 3, 120, 24);
    add(lblMensalidade);

    lblRodape = new JLabel("");
    lblRodape.setBounds(10, 56, 400, 24);
    add(lblRodape);

    txtIdAluno = new JTextField();
    txtIdAluno.setBounds(10, 28, 65, 24);
    add(txtIdAluno);

    txtNome = new JTextField();
    txtNome.setBounds(85, 28, 180, 24);
    add(txtNome);


    try {
        mskTelefone = new MaskFormatter("(##)####-####");
    } catch (ParseException telefone) {
        System.out.println("Telefone invalido");
    }
    fTxtTelefone = new JFormattedTextField(mskTelefone);
    fTxtTelefone.setBounds(275, 28, 110, 24);
    add(fTxtTelefone);

    txtMensalidade = new JTextField();
    txtMensalidade.setDocument(new Moeda());
    txtMensalidade.setBounds(400, 28, 90, 24);
    add(txtMensalidade);

    btnIncluir = new JButton("Incluir");
    btnIncluir.setBounds(380, 58, 102, 26);
    add(btnIncluir);

    txtIdAluno.addKeyListener(new Limitar());
    btnIncluir.addActionListener(new IncluirAluno());
    btnIncluir.addFocusListener(new MaisUm());

}

public class IncluirAluno implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent ev) {
        String a = txtMensalidade.getText().replaceAll("\\.", "");

        try {
            // cria um preparedStatement
            PreparedStatement pStmt = conexao.con.prepareStatement("INSERT INTO alunos VALUES(?,?,?,?)");

            // preenche os valores
            pStmt.setString(1, txtIdAluno.getText());
            pStmt.setString(2, txtNome.getText());
            pStmt.setString(3, fTxtTelefone.getText());
            pStmt.setString(4, a.replaceAll(",", "."));

            // executa
            pStmt.execute();
            pStmt.close();

            lblRodape.setText("1 Linha adicionada");
            
            conexao.con.close();

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

public class MaisUm implements FocusListener {

    @Override
    public void focusLost(FocusEvent e) {
        lblRodape.setText("");
        txtIdAluno.setText("");
        txtNome.setText("");
        fTxtTelefone.setText("");
        txtMensalidade.setText("");
        txtIdAluno.requestFocus();
    }

    @Override
    public void focusGained(FocusEvent e) {
    }
}

public class Limitar implements KeyListener {

    @Override
    public void keyTyped(KeyEvent e) {
        int k = e.getKeyChar();
        if (txtIdAluno.getText().length() < 6) {
            //deixe passar  
        } else {
            e.setKeyChar((char) KeyEvent.VK_CLEAR);
        }
    }

    @Override
    public void keyPressed(KeyEvent e) {
    }

    @Override
    public void keyReleased(KeyEvent e) {
    }
}

}[/code]

Classe de formatação do campo em moeda Mensalidade:

[code]/**

import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

public class Moeda extends PlainDocument {

public static final int NUMERO_DIGITOS_MAXIMO = 9;

@Override
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {

    String texto = getText(0, getLength());
    for (int i = 0; i < str.length(); i++) {
        char c = str.charAt(i);
        if (!Character.isDigit(c)) {
            return;
        }
    }

    if (texto.length() < Moeda.NUMERO_DIGITOS_MAXIMO) {
        super.remove(0, getLength());
        texto = texto.replace(".", "").replace(",", "");
        StringBuilder valor = new StringBuilder(texto + str);

        if (valor.length() > 0 && valor.charAt(0) == '0') {
            valor.deleteCharAt(0);
        }

        if (valor.length() < 3) {
            if (valor.length() < 1) {
                valor.insert(0, "000");
            } else if (valor.length() < 2) {
                valor.insert(0, "00");
            } else {
                valor.insert(0, "0");
            }
        }

        valor.insert(valor.length() - 2, ",");

        if (valor.length() > 6) {
            valor.insert(valor.length() - 6, ".");
        }

        if (valor.length() > 10) {
            valor.insert(valor.length() - 10, ".");
        }
        super.insertString(0, valor.toString(), a);
    }
}

@Override
public void remove(int offset, int length) throws BadLocationException {
    super.remove(offset, length);
    String texto = getText(0, getLength());
    texto = texto.replace(",", "");
    texto = texto.replace(".", "");
    super.remove(0, getLength());
    insertString(0, texto, null);
}

}[/code]

Já não sei o que pesquisar pra atualizar o conteudo da tabela, espero que possam me ajudar…

Caro colega.
De uma maneira bem simples assim que você inserir a informação você pode estar pegando o método que recarrega a lista que vai carregar seu datatable.

procure pelo pattern “Observer”

existem diversos exemplos do mesmo por ai

opa, vlw pela dica Orlando, vou pesquisar sobre…

Otavio, vc fala de carregar o modelo novamente???