JTable não atualiza automaticamente

13 respostas
G

Olá, meu problema é o seguinte, tenho uma JTable que recebe valores de um ArrayList so que ela não atualiza automaticamente, ja tentei utilizar o dtg_funcionarios.repaint(), onde dtg_funcionarios é o nome da tabela, o unico modo de mostrar o conteudo da JTable foi mostrando denovo o formulário através do setVisible(true), so que assim fica mostrando dois formulários na tela, e ela é inicializada novamente...

o código que estou usando é o seguinte:

public void inicializarTabela(ArrayList dadosTabela, int numeroColunasTabela) {
        int totalLinhas;
        int numeroLinha = 0, numeroColuna = 0, contador = 0;

        totalLinhas = (dadosTabela.size() / numeroColunasTabela);
        
        DefaultTableModel modelo = new DefaultTableModel();

        modelo.addColumn("Código do Funcionário");
        modelo.addColumn("Nome");
        modelo.addColumn("CPF");
        modelo.addColumn("Carteira de Trabalho");
        modelo.addColumn("Cidade");
        modelo.addColumn("Estado");
        modelo.addColumn("Endereco");
        modelo.addColumn("CEP");
        modelo.addColumn("Telefone");
        modelo.addColumn("E-mail");
        modelo.addColumn("Cargo");
        modelo.addColumn("Salário");
        modelo.addColumn("Data de Admissao");
        modelo.addColumn("Data de Saída");
        
        for (numeroLinha = 0; numeroLinha < totalLinhas; numeroLinha++) {
            modelo.addRow(new String[] {"", ""});
            for (numeroColuna = 0; numeroColuna < numeroColunasTabela; numeroColuna++) {
                dtg_funcionarios.setModel(modelo);
                dtg_funcionarios.setValueAt(dadosTabela.get(contador), numeroLinha, numeroColuna);
                contador += 1;
            }
        }
        //ajeitar para não precisar abrir um novo formulario, somente dar um refresh na tabela!
        setVisible(true);
    }

e a parte em que manda o conteudo do banco para esse metodo:

private void exibirDados(ResultSet rs) throws SQLException {
        ResultSetMetaData rsmd;
        int numeroColunasTabela;
        
        try {
            rsmd = rs.getMetaData();
            trazerDadosBanco(rs, rsmd);
            numeroColunasTabela = rsmd.getColumnCount();
            //dadosTabela fica dentro do metodo trazerDadosBanco
            frmF.inicializarTabela(dadosTabela, numeroColunasTabela);
        } catch (SQLException sqlex) {
            sqlex.printStackTrace();
        }
    }

lembrando que são em classes diferentes, a primeira parte do codigo fica na classe do formulário, e a segunda parte fica dentro de outra classe.

13 Respostas

f4binho

Sempre após vc inserir algum valor no JTable, para que ele dê o refresh, use o updateUI();

// Aqui \ o /
tabela.updateUI();

Espero ter ajudado

G

não, infelizmente não adinantou, meu codigo ficou o seguinte:

for (numeroLinha = 0; numeroLinha < totalLinhas; numeroLinha++) { modelo.addRow(new String[] {"", ""}); for (numeroColuna = 0; numeroColuna < numeroColunasTabela; numeroColuna++) { dtg_funcionarios.setModel(modelo); dtg_funcionarios.setValueAt(dadosTabela.get(contador), numeroLinha, numeroColuna); dtg_funcionarios.updateUI(); dtg_funcionarios.repaint(); dtg_funcionarios.validate(); validate(); contador += 1; } }

mesmo assim ela não atualiza, só atualiza abrindo uma nova estância do formulário, através do setVisible(true), alguma propriedade da JTable tem que ser mudada? ou então algum modo de fazer um repaint() no próprio formulário?

agradeço a ajuda.

L

Só uma dica: não use o DefaultTableModel.
Dê uma olhada na implementação de TableModel nesse exemplo:
http://www.guj.com.br/posts/list/100793.java

É facil e você só precisa passar uma lista de colunas para ele e a atualização é automatica.

http://www.informit.com/articles/article.aspx?p=332278
http://www.informit.com/articles/article.aspx?p=333472

ViniGodoy

Não precisa chamar esse tipo de método.

Certifique-se que a variável dtg_funcionarios é a mesma que está sendo exibida.
O setVisible(true) não deveria abrir outro formulário, então, vc deve ter dado um segundo new no seu formulário em algum lugar, e está chamando a atualização nesse segundo formulário e não no que está sendo mostrado.

G

creio que não ViniGodoy, quando eu comento a linha do setVisible(true) o programa não abre outro formulário e consequentemente não mostra a atualização da JTable, o codigo do formulário segue em anexo.

ViniGodoy

Pode anexar também a classe entidade?

G

aqui vai ela:

package SistemaAquarius;

/**
 *
 * @author Gabriel Lucena
 */

public class entidade extends javax.swing.JFrame{

    protected String nome, cidade, estado, endereco, cep, telefone, email, pesquisar;
    
    entidade() {

    }

    public entidade(String pNome, String pCidade, String pEstado, String pEndereco, String pCep, String pTelefone, String pEmail, String pPesquisar) {
        this.nome = pNome;
        this.cidade = pCidade;
        this.estado = pEstado;
        this.endereco = pEndereco;
        this.cep = pCep;
        this.telefone = pTelefone;
        this.email = pEmail;
        this.pesquisar = pPesquisar;
    }

    public String getCep() {
        return cep;
    }

    public void setCep(String pCep) {
        this.cep = pCep;
    }

    public String getCidade() {
        return cidade;
    }

    public void setCidade(String pCidade) {
        this.cidade = pCidade;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String pEmail) {
        this.email = pEmail;
    }

    public String getEndereco() {
        return endereco;
    }

    public void setEndereco(String pEndereco) {
        this.endereco = pEndereco;
    }

    public String getEstado() {
        return estado;
    }

    public void setEstado(String pEstado) {
        this.estado = pEstado;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String pNome) {
        this.nome = pNome;
    }

    public String getPesquisar() {
        return pesquisar;
    }

    public void setPesquisar(String pPesquisar) {
        this.pesquisar = pPesquisar;
    }

    public String getTelefone() {
        return telefone;
    }

    public void setTelefone(String pTelefone) {
        this.telefone = pTelefone;
    }
}
ViniGodoy

Também seria bom anexar o código que abre esse formulário.

Uma coisa é fato, quando um form está visível, chamar setVisible(true) não abre outro form. Isso só acontece se você está mexendo num form invisível.

Então, com absoluta certeza, em algum lugar você está criando 2 formulários. Num deles, você pensa que está mexendo, e está visível. No outro, invisível, você está atualizando o JTable.

G

eu estou trabalhando com um formulário a parte ou seja, em vez de compilar todo o projeto, eu uso o shift+F6 pra abrir somente esse JFrame, e o formulário que abre o meu formulário não está comigo, esse pode ser o problema?

ViniGodoy

Onde você chama o método inicializarTabela? Não vejo nenhuma chamada a ele no código que você me passou.

G

eu não sei como por em anexo... =/ então ai vai o codigo, eu passo todos os parametros para uma outra classe que faz a conexão com o banco e grava os dados e busca no banco e retorna para o formulário principal:

package SistemaAquarius;
import java.sql.*;
import java.util.*;
import java.text.*;
import java.util.Date;

/**
 *
 * @author Gabriel Lucena
 */
public class funcionarios extends frm_funcionarios{
    Conexao connect = new Conexao();
    frm_funcionarios frmF = new frm_funcionarios();
    ArrayList dadosTabela = new ArrayList();

    private String carteiraTrabalho, cargo, cpf, salario, dataAdmissao, dataSaida;
    //variaveis que foram criadas
    private float floatSalario;
    private Date dateDataAdmissao, dateDataSaida;
    private String ano, mes, dia;
    //String de conexão SQL
    private Connection conn;

    public funcionarios (String pNome, String pCpf, String pCarteiraTrabalho, String pCidade, String pEstado, String pEndereco, String pCep, String pTelefone, String pEmail, String pCargo, String pSalario, String pDataAdmissao, String pDataSaida, String pPesquisar) {
        entidade e = new entidade(pNome, pCidade, pEstado, pEndereco, pCep, pTelefone, pEmail, pPesquisar);

        this.carteiraTrabalho = pCarteiraTrabalho;
        this.cargo = pCargo;
        this.cpf = pCpf;
        this.salario = pSalario;
        this.dataAdmissao = pDataAdmissao;
        this.dataSaida = pDataSaida;

        nome = e.getNome();
        cidade = e.getCidade();
        estado = e.getEstado();
        endereco = e.getEndereco();
        cep = e.getCep();
        telefone = e.getTelefone();
        email = e.getEmail();
        pesquisar = e.getPesquisar();
    }

    public String getCargo() {
        return cargo;
    }

    public void setCargo(String pCargo) {
        this.cargo = pCargo;
    }

    public String getCarteiraTrabalho() {
        return carteiraTrabalho;
    }

    public void setCarteiraTrabalho(String pCarteiraTrabalho) {
        this.carteiraTrabalho = pCarteiraTrabalho;
    }

    public String getCpf() {
        return cpf;
    }

    public void setCpf(String pCpf) {
        this.cpf = pCpf;
    }

    public String getSalario() {
        return salario;
    }

    public void setSalario(String pSalario) {
        this.salario = pSalario;
    }

    public String getDataSaida() {
        return dataSaida;
    }

    public void setDataSaida(String pDataSaida) {
        this.dataSaida = pDataSaida;
    }

    public String getDataAdmissao() {
        return dataAdmissao;
    }

    public void setDataAdmissao(String pDataAdmissao) {
        this.dataAdmissao = pDataAdmissao;
    }

    public void cadastrar(String pDriver, String pPassword, String pUrl, String pUserName, String pQuery) {
        try{
            SimpleDateFormat modelo = new SimpleDateFormat();

            floatSalario = Float.parseFloat(salario);
            
//            ano = dataAdmissao.substring(6, 10);
//            mes = dataAdmissao.substring(3, 5);
//            dia = dataAdmissao.substring(0, 2);
//            dataAdmissao = ano+"-"+mes+"-"+dia;
//            //dateDataAdmissao = ;
//
//            ano = dataSaida.substring(6, 10);
//            mes = dataSaida.substring(3, 5);
//            dia = dataSaida.substring(0, 2);
//            dataSaida = ano+"-"+mes+"-"+dia;
//            //dateDataSaida = ;
            
        } catch(NullPointerException e){
            e.printStackTrace();
        } catch(Exception e) {
                e.printStackTrace();
        }
        
        pQuery = "insert into funcionario (nome, cpf, carteiraTrabalho, cidade, estado, endereco, cep, telefone, email, cargo, salario, dataAdmissao, dataSaida) values ("
                + "'" + nome + "' "
                + ",'" + cpf + "' "
                + ",'" + carteiraTrabalho + "' "
                + ",'" + cidade + "' "
                + ",'" + estado + "' "
                + ",'" + endereco + "' "
                + ",'" + cep + "' "
                + ",'" + telefone + "' "
                + ",'" + email + "' "
                + ",'" + cargo + "' "
                + ",'" + floatSalario + "' "
                + ",'" + "2000-12-01" + "' "
                + ",'" + "0001-01-01" + "')";

        connect.setDriver(pDriver);
        connect.setPassword(pPassword);
        connect.setURL(pUrl);
        connect.setUserName(pUserName);

        connect.conecta();
        connect.exeQuery(pQuery);
        connect.desconecta();

        pQuery = "select * from funcionario order by codFuncionario desc limit 1";
        inicializarPesquisaBanco(pDriver, pPassword, pUrl, pUserName, pQuery);

        limpar();
    }

    private void inicializarPesquisaBanco(String pDriver, String pPassword, String pUrl, String pUserName, String pQuery) {
        Statement stmt;
        ResultSet rs;

        try {
            Class.forName(pDriver);
            conn = DriverManager.getConnection(pUrl, pUserName, pPassword);
        } catch (ClassNotFoundException cnfex) {
            cnfex.printStackTrace();
        } catch (SQLException sqlex) {
            sqlex.printStackTrace();
        }
        
        try {
            stmt = conn.createStatement();
            rs = stmt.executeQuery(pQuery);
            exibirDados(rs);
            stmt.close();
            conn.close();
        } catch(SQLException sqlex) {
            sqlex.printStackTrace();
        }
    }

    private void exibirDados(ResultSet rs) throws SQLException {
        ResultSetMetaData rsmd;
        int numeroColunasTabela;
        
        try {
            rsmd = rs.getMetaData();
            trazerDadosBanco(rs, rsmd);
            numeroColunasTabela = rsmd.getColumnCount();
            //dadosTabela fica dentro do metodo trazerDadosBanco
            frmF.inicializarTabela(dadosTabela, numeroColunasTabela);
        } catch (SQLException sqlex) {
            sqlex.printStackTrace();
        }
    }

    private void trazerDadosBanco(ResultSet rs, ResultSetMetaData rsmd) throws SQLException {
        int i;
        while (rs.next()) {
            for(i = 1; i <= rsmd.getColumnCount(); i++)  {
                switch(rsmd.getColumnType(i))  {
                    case Types.VARCHAR: {
                        dadosTabela.add(rs.getString(i).toString());
                        break;
                    }
                    case Types.TIMESTAMP: {
                        dadosTabela.add(rs.getTimestamp(i).toString());
                        break;
                    }
                    case Types.TIME: {
                        dadosTabela.add(rs.getTime(i).toString());
                        break;
                    }
                    case Types.DATE: {
                        dadosTabela.add(rs.getDate(i).toString());
                        break;
                    }
                    case Types.REAL: {
                        dadosTabela.add(new Float(rs.getFloat(i)).toString());
                        break;
                    }
                    case Types.INTEGER: {
                        dadosTabela.add(new Integer(rs.getInt(i)).toString());
                        break;
                    }
                }
            }
        }
    }

    public void pesquisar(String pDriver, String pPassword, String pUrl, String pUserName, String pQuery) {
        pQuery = "select * from funcionario where codFuncionario = '" + pesquisar + "'";
        inicializarPesquisaBanco(pDriver, pPassword, pUrl, pUserName, pQuery);
    }

    public void atualizar(String pDriver, String pPassword, String pUrl, String pUserName, String pQuery, int pCodFuncionario) {
        connect.setDriver(pDriver);
        connect.setPassword(pPassword);
        connect.setURL(pUrl);
        connect.setUserName(pUserName);

        pQuery = "update funcionario set " +
                "nome = '" + nome + "', " +
                "cpf = '" + cpf + "', " +
                "carteiraTrabalho = '" + carteiraTrabalho + "', " +
                "cidade = '" + cidade + "', " +
                "estado = '" + estado + "', " +
                "endereco = '" + endereco + "', " +
                "cep = '" + cep + "', " +
                "telefone = '" + telefone + "', " +
                "email = '" + email + "', " +
                "cargo = '" + cargo + "', " +
                "salario = '" + floatSalario + "', " +
                "dataAdmissao = '" + "2000-01-31" + "', " +
                "dataSaida = '" + "2000-01-31" + "' where codFuncionario = " + pCodFuncionario;

        connect.conecta();
        connect.exeQuery(pQuery);
        connect.desconecta();

        pQuery = "select * from funcionario where codFuncionario = " + pCodFuncionario;
        inicializarPesquisaBanco(pDriver, pPassword, pUrl, pUserName, pQuery);

        limpar();
    }
}
ViniGodoy

Aí cara, vc está criando 2 formulários.

Veja lá, quando vc roda com shift+f6, seu main faz:

new frm_funcionarios().setVisible(true);

E nessa sua outra classe, você faz:
frm_funcionarios frmF = new frm_funcionarios();

frmF não é o mesmo form que foi criado no Shift+F6. Cada new cria um formulário diferente.

Só uma dica. Herança é usada muito raramente, quando é usada, dificilmente ultrapassa 2 níveis. Ela deve expressar a relação é um.
Então, logo nota-se que seu código tem um problema sério de modelagem.

Pensando no mundo real, comece a se perguntar:

Uma entidade é um formulário?
Um “funcionarios” é um formulário de funcionarios?

Claramente você vê problemas aí.

Classes também devem fazer sentido. O nome de uma classe dificilmente será no plural, pois elas representam um conceito.
Quem representa vários funcionários são as entidades criadas por essa classe, os objetos. Então, você pode ter uma única classe “Funcionário” e dela criar um lista de funcionários.

Um formulário é um funcionário, ou apenas “tem um” funcionário? A resposta é que o formulário só tem um funcionário, que é exibido e atualizado. O formulário em si não é um funcionário. Então, a relação correta é agregação, não herança.

Para usar a opção de anexos basta clicar no botão “Attachments” que tem na hora de escrever mensagens.

G

eu entendi, realmente retirar o objeto “frm_funcionarios frmF = new frm_funcionarios” fez com que não abrisse outro formulário, porem, agora, eu não tenho como retornar o ArrayList para o formulário original com os dados do banco… alguem sabe como fazer isso?

Criado 11 de junho de 2010
Ultima resposta 12 de jun. de 2010
Respostas 13
Participantes 4