Atualizar JTable!

7 respostas
andre_bento

Olá galera…
To precisando da ajuda de vcs aqui novamente pessoal!!!
Bom é o seguinte…
Tenho uma JTable que está sendo modelada por uma tableModel…
Ela está buscando os dados do banco… .tá tudo ok…funcionando que é uma beleza…
Mas tenho um botão de incluir e abre uma outra tela onde o usuário digita um produto…
Gostaria que ao clicar em incluir ele gravasse o novo registro no Banco e também atualizasse minha JTable sem ser necessário eu criar um novo objeto!!
Mas não sei como… vi sobre o fireTableDataChanged() mas não consegui êxito!!
Se alguém puder me ajudar!!!
Abraços a todos!!

7 Respostas

andre_bento

Olá galera…
só lembrando que minha tabela está em outra tela!!!
É isso que tá pegando pra mim… porque pra mecher nessa tabela tenho que criar um outro objeto dessa tela pra poder manipular essa tabela…mas ae já criei um novo objeto e a table não é atualizada e sim criada novamente…
Me ajuuuuuuudem

71C4700

Voce pode aou adicionar umlistener na tela onde é realizada a operação de salvar e quando ocorre este evento vc realiza novamente a consulta no banco, ou coloca sua tabela pra ser atualizada por uma Thread secundaria onde fica infinitamente com algum laço de repetição verificando o banco ou com algum tempo de 5 em 5 segundos.

Fica a seu criterio escolher, mas acredito que o listener seria a melhor olução ate mesmo por questao deperformace e demasiadas consultas no banco.

At…

Luciano_Matheus

Eu estava com um problema parecido com o seu, e o que eu fiz foi atualizar o TableModel toda vez que um registro era incluído no banco, da seguinte forma:

- Eu criei um método que retornava um TableModel chamado atualizarTabela:

public DefaultTableModel atualizarTabela()
{

                //Array de String contendo os nomes das colunas	
                String[] col = new String []{"Código","Produto"};   
	String[][] row = new String [][] {   
	       {"",""}   
	};  
	
	//Criando um modelo para uma tabela sem registro com as colunas e linhas declaradas anteriormente
                DefaultTableModel modeloPadrao = new DefaultTableModel(row, col);
	
	try
	{
	           //Buscando a os dados da tebela no banco e adicionando em vetores	
                           rs = this.stm.executeQuery("SELECT * FROM Produto");
		
        Vector dados = new Vector();   
        Vector colunas = new Vector();
        
        colunas.add("Código");   
        colunas.add("Produto");
   
        while (rs.next())   
        {   
        	Vector linhaDaTabela = new Vector();   
        	linhaDaTabela.add(rs.getString("codigo"));   
        	linhaDaTabela.add(rs.getString("produto"));
        	dados.add(linhaDaTabela);   
        }
        
        //Criando o modelo já com os dados atualizados do banco
        DefaultTableModel modelo = new DefaultTableModel(dados, colunas);
        rs.close(); //fechando o resultset
		return modelo;
		
	}
	catch (SQLException e)
	{
		e.printStackTrace();
	}
	return modeloPadrao;

}

- Depois é só chamar este método na declaração do método setModel da JTable, e colocá-lo no evento do botão incluir, assim toda vez que for inserido um novo registro no banco este método irá atualizar o TableModel da JTable buscando todos os dados salvos no banco, desta forma não há necessidade de criar um novo objeto da JTable.

Espero ter ajudado!

Vlw!

71C4700

Desculpe-me mas acredito que teria algumas conciderações a fazer:

  1. Não utilize Vector;
  2. Não Utilize DefaultTableModel, cria a sua propria pois assim terá um controle melhor sobre os dados e estes nao serão duplicadados.
  3. A ideia do listener era mais ou menos essa que o amigo Luciano Matheus falou, mas vc poderia coloca-lo como listeners em todas as operações que pudessem refletir na sua tabela, inserção, exclusão, atualização, e demais…

Alguns TableModel que trabalha de forma simples com os dados,baseando-se em uma lista de objetos passado pra ela:

Veja com é feito voce pode utilizar ou criar sua propria.

Att…

Fernando_Generoso_da

Passe como parâmetro para sua tela onde vc inclui o novo produto, o TableModel da sua JTable. Ao salvar, se for bem sucedida a operação, vc insere o novo produto no table mode. No table model, no método que adiciona um novo registro, logo após colocá-lo no list de objetos, chame o fireTableDataChanged() que aí sim na tua table, na outra tela irá ser atualizada.

Fernando Rosa

andre_bento

Olá amigos!!!
Primeiramente uito obrigado pela ajuda amigos do GUJ!!!
Bom… Amigo Luciano Matheus… eu tenho métodos que são quase idênticos a esse que me falou… só que dividi em 3 partes… o código:

public String[][] dadosCliente(Vector<GrupoDeProduto> vetor){
            int tam=0;
            tam = vetor.size();
            String[][] dGrupoDeProduto = new String[tam][2];

            for(int z=0;z < tam;z++){
                    dGrupoDeProduto[z][0] = String.valueOf(vetor.get(z).getxGruCod());
                    dGrupoDeProduto[z][1] = vetor.get(z).getxGruNome();
            }//fim do for
            return dGrupoDeProduto;
    } //fim do dadosUsuarios




    //dadosEmVetor
    public Vector<GrupoDeProduto> dadosEmVetor(){
            DAOFactory df=DAOFactory.getDAOFactory(DAOFactory.POSTGRES);
            DAOGrupoDeProduto dao = df.getDAOGrupoDeProduto();
            dao.resultDados();
            vetor = new Vector<GrupoDeProduto>(30,10);
            try{
                    String resultDados[][] = dao.getDados();
                    int tam = resultDados.length;
                    for (int i=0; i<tam; i++){

                            String codigo   = resultDados[i][0];
                            String nome     = resultDados[i][1];

                            GrupoDeProduto grupoDeProduto = new GrupoDeProduto();

                            grupoDeProduto.setxGruCod(Integer.parseInt(codigo));
                            grupoDeProduto.setxGruNome(nome);

                            vetor.add(grupoDeProduto);
                    }//fim do for
            }//fim do try
            catch(Exception e){
                    JOptionPane.showMessageDialog(null,"Erro durante a gravação dos dados no vetor :"+e,"ERRO",JOptionPane.ERROR_MESSAGE);
            }
            return vetor;
    }//fim do método dadosEmVetor



    public DefaultTableModel getTableModelConsulta(){
            dadosEmVetor();
            String dVendedor[][] = dadosCliente(dadosEmVetor());

            tabelaModel = new DefaultTableModel(dVendedor,campos);
            return tabelaModel;
    }

Eu tentei fazer o que o amigo falou e coloquei uma chamada ao método getTableModelConsulta dentro do botão de incluir para ele poder tentar atualizar a tabela… mas não consegui êxito :frowning:
Esse método getTableModelConsulta está setando minha tableModel…
Mas não sei o porque não está funcionando!!
Estive pesquisando e achei alguns amigos dizendo que eu teria que “fala” que ela estaria sendo mudada… mais ou menos assim…

Ao amigo 71C4700…
O qyue me aconselha a usar no lugar do vector amigo???
Tem algum material que vc possa me passar pra eu dar uma olhada???
Já estou estudando aqueles 2 links que me passaste!!!

Ao amigo Fernando Generoso…Como utilizo esse método fireTableDataChanged()???
E não entendi muito bem como devo proceder… poderia me falar mais sobre como vc explicou?

Desde já muito obrigado a todos os amigos…
Abraçosss
O que posso fazer amigo para poder atualizar essa table???

Fernando_Generoso_da

primeiro: implemente um TableModel específico para você, que extende a classe AbstractTableModel.
Nessa classe, crie métodos para adicionar objetos na tua lista de dados. Um exemplo de TableModel:

public class CondicaoPagamentoTableModel extends AbstractTableModel {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private List<CondicaoPagamento> items = new ArrayList<CondicaoPagamento>();

	@Override
	public Class<?> getColumnClass(int columnIndex) {
		switch (columnIndex) {
		case 0:
			return Integer.class;
		case 1:
			return String.class;
		case 2:
			return String.class;
		default:
			return String.class;
		}
	}

	@Override
	public boolean isCellEditable(int rowIndex, int columnIndex) {
		return false;
	}

	@Override
	public String getColumnName(int column) {
		switch (column) {
		case 0:
			return "Código";
		case 1:
			return "Nome";
		case 2:
			return "Descrição";
		default:
			return "";
		}
	}

	public List<CondicaoPagamento> getItems() {
		return this.items;
	}

	public CondicaoPagamento getItem(int row) {
		return items.get(row);
	}

	public void removeItem(CondicaoPagamento condicaoPagamento) {
		this.items.remove(condicaoPagamento);
		this.fireTableDataChanged();
	}

	public void removeAllElements() {
		this.items.clear();
		this.fireTableDataChanged();
	}

	public void setItems(List<CondicaoPagamento> items) {
		this.items = items;
		this.fireTableDataChanged();
	}

	public void addItem(CondicaoPagamento condicaoPagamento) {
		this.items.add(condicaoPagamento);
		this.fireTableDataChanged();

	}

	public int getColumnCount() {

		return 3;
	}

	public int getRowCount() {

		return items.size();
	}

	public Object getValueAt(int rowIndex, int columnIndex) {
		switch (columnIndex) {
		case 0:
			return items.get(rowIndex).getCodigoCondicaoPagamento();
		case 1:
			return items.get(rowIndex).getNomeCondicaoPagamento();
		case 2:
			return items.get(rowIndex).getDescricaoCondicaoPagamento();
		default:
			return "";
		}

	}

}

Ao criar a JTable, tu instancia o teu tableModel e passa no construtor da JTable.

Ao clicar o botão que que abre o outro form, no construtor desse form tu passa esse model, da tua JTable para a nova tela.
Ao salvar o objeto, depois da confirmação que foi salvo no banco, tu pega esse objeto e adiciona no table.
Como tu pode ver no meu exemplo, nessa parte:

public void addItem(CondicaoPagamento condicaoPagamento) {
		this.items.add(condicaoPagamento);
		this.fireTableDataChanged();

	}

eu tenho um método que me adiciona um item, e logo depois, o model se atualiza, avizando pra tabela que ocorreu uma mudança na lista de items.

Espero ter ajudado, e de uma estudada em TableModel.

Fernando

Criado 18 de agosto de 2009
Ultima resposta 19 de ago. de 2009
Respostas 7
Participantes 4