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

3 respostas
andbecker

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

otaviojava

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.

orlandocn

procure pelo pattern “Observer”

existem diversos exemplos do mesmo por ai

andbecker

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