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

3 respostas
A

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:

/**
 * @author Luciano Santos
 * @site www.analisedesistemas.wordpress.com
 */

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

Classe da Tabela Modelo:

/**
 * @author Luciano Santos
 * @site www.analisedesistemas.wordpress.com
 */
package escola;

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

Classe da interface principal:

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

Classe do botão adicionar:

/**
 * @author Luciano Santos
 * @site www.analisedesistemas.wordpress.com
 */
package escola;

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) {
        }
    }
}

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

/**
 * @author Dantalian
 * @site http://www.guj.com.br/
 */
package escola;

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

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

3 Respostas

O

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.

O

procure pelo pattern “Observer”

existem diversos exemplos do mesmo por ai

A

opa, vlw pela dica Orlando, vou pesquisar sobre…

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

Criado 13 de julho de 2011
Ultima resposta 13 de jul. de 2011
Respostas 3
Participantes 3