JTable não está sendo atualizada

2 respostas
rafael.espiritosanto

Caros colegas,

Eu estou fazendo um sistema que tem uma parte de busca. Na tela de Pesquisa, eu tenho um JTextField + JButton e um JTable responsável por mostrar os resultados da pesquisa do banco. No início, a JTable contém todos os registros da tabela.

O que eu quero fazer é com que, ao clicar no JButton, a tabela seja atualizada com os resultados encontrados no banco, a partir do filtro digitado.

No entanto, a tabela não está sendo atualizada

public void atualizarTabela(){
       
        dados = converteArraylistEmMatriz(bd.filtraCursos(strCurso.getText()));
       
        DefaultTableModel d = new DefaultTableModel(dados, colunas);
        painelTabela.removeAll();
        tabelaDeCursos = new JTable(d);
        painelTabela.add(tabelaDeCursos);
        repaint();       
    }

Valeu pela ajuda!

2 Respostas

gabrielmassote

Tudo bem rafael.espiritosanto?

aqui…tenho um modelo abstrato aqui…vou postar pra vc…

ai ao invés de toda hora criar um novo modelo, voce pode usar os metodos desse modelo abstrato que limpa toda tabela e adiciona dados na linha.

import java.util.*;
import javax.swing.table.*;

public class TableModel extends AbstractTableModel {

	private boolean [] colsEdicao;

	private ArrayList linhas = null;
	private String[] colunas = null;
	private int NroLinha = -1; //coluna a ser removida
	public String[] getColunas() {return colunas;}
	public ArrayList getLinhas() {return linhas;}
	public int getLinhaSelecionada() { return NroLinha; }
	public void setLinhaSelecionada(int linha) { NroLinha = linha; }
	public void setColunas(String[] strings) {colunas = strings;}
	public void setLinhas(ArrayList list) {linhas = list;}

	public TableModel(String[] nomeColunas, int nroColunas, boolean editColunas) {
		boolean [] edicao = new boolean[nroColunas];
		for(int i=0; i<nroColunas; i++) 
			edicao[i] = editColunas;

		
		ArrayList dados = new ArrayList();

		setLinhas(dados);
		setColunas(nomeColunas);
		colsEdicao = edicao;
	}


	public boolean isCellEditable(int row, int col){
		return colsEdicao[col];
	}   

	public int getColumnCount() {return getColunas().length;}

	public int getRowCount() {return getLinhas().size();}

	public Object getValueAt(int rowIndex, int columnIndex) {

		String [] linha = (String [])getLinhas().get(rowIndex);

		return linha[columnIndex];
	}

	public void setValueAt(Object value, int row, int col){
		String [] linha = (String [])getLinhas().get(row);

		linha[col] = (String)value;

		fireTableCellUpdated(row,col);
	}

	public void addRow( String [] dadosLinha){
		getLinhas().add(dadosLinha);

		int linha = getLinhas().size()-1;

		fireTableRowsInserted(linha,linha);

		return;
	}

	public void removeRow(int row){
		getLinhas().remove(row-1);

		fireTableRowsDeleted(row,row);
	}

	public String getColumnName(int col){
		return getColunas()[col];
	} 
	
	 public void clearTable() {
		   	
		   	getLinhas().clear();
		   	
     }


}

Modo de usar:

/* a string é o nome das colunas
*  o numero 3 é o numero de colunas
*  e o false é se os campos podem ser editados ou nao
*/
TableModel modelo = new TableModel(new String[] {"Coluna 1","Coluna 2","Coluna 3"},3,false);

JTable jTable1 = new JTable(modelo);

//ai no codigo que voce postou, voce apenas utiliza os metodos do modelo, como abaixo
   public void atualizarTabela(){
       //aqui ele limpa os dados da tabela
        modelo.clearTable()
        //aqui voce vai ter que manipular os dados para adicionar a cada linha, pois o metodo addRow adiciona os dados apenas em uma linha
        modelo.addRow(new String[] {"dados coluna 1","dados coluna 2","dados coluna 3"});

    }

creio que é isso…acho que nao esqueci nada de como usar a classe…qualquer coisa me responda que fico on o dia todo…

arbacos

ViniGodoy

Oi,

Primeiramente, é bom aprender como o JTable funciona. O DefaultTableModel foi incluído no Swing para que a Sun demonstrasse o funcionamento do JTable, não para ser usado na prática. Além de pouco prático, seu código fica desorganizado e altamente sujeito a erros.

O TableModel é o objeto que faz a tradução das suas classes de negócio para a tabela. É importantíssimo montar um tablemodel personalizado para cada problema. Abaixo, tem um ótimo artigo que explica como se faz isso:
http://www.informit.com/articles/article.aspx?p=332278

Se precisar que sua tabela seja editável, siga também esse artigo depois do primeiro:
http://www.informit.com/articles/article.aspx?p=333472

Depois que você fizer o TableModel certo, vários dos problemas desaparecerão.

O importante é que o TableModel trabalhe com o seu domínio do problema, e não com Strings. Assim, se vc está exibindo objetos da classe cliente, dentro do seu TableModel haverá uma lista de clientes. O método add desse TableModel receberá como parâmetro um cliente e assim por diante. O Model é que fica com a informação sobre que colunas do cliente deverão ser exibidas e como.

Isso evita que você duplique dados, e mantém o conceito de MVC na sua aplicação. Também deixa o seu código mais limpo e mais fácil de manter.

Criado 9 de julho de 2008
Ultima resposta 9 de jul. de 2008
Respostas 2
Participantes 3