JTable - apagar todos os dados

18 respostas
F

Pessoal,

Boa tarde! Estou desenvolvendo uma aplicação para geração de uma carteira de materiais para a minha empresa, cada produto cadastrado tem uma lista de materiais e ao colocar um pedido de vendas deste produto preciso que seja gerada uma necessidade para os componentes deste item. Pois bem, para que isto funcione precisei desenvolver a relação de produto mestre x componentes, o meu problema está na visualização destes dados, criei uma JTable que me lista todos os componentes relacionados ao item mestre, esta lista é mostrada quando clico no botão de busca, porém ao fazer uma nova procura eu preciso que a JTable seja zerada para não duplicar os dados mostrados, e é exatamente isto que não estou conseguindo fazer acontecer.

Primeiramente criei um tablemodel que estende AbstractTableModel, a minha idéia foi remover linha por linha do modelo até que não tivesse nenhuma, portanto desenvolvi o método:

public void removeRow(int row) {
		getLinhas().remove(row);
		fireTableRowsDeleted(row,row);
	}

	public void limpaTabela() {
		int size = getRowCount();
		for(int i = 0; i < size; i++) {
			removeRow(i);
		}
	}

Isto está “aparentemente” funcionando, exceto pelo fato de eu receber a seguinte exception:

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 2, Size: 1

Estou realizando o teste em uma JTable que possui 3 linhas, onde todas estão sendo apagados exceto a linha de número 2 (index: 1).

O mais interessante é que ao usar getLinhas().remove(0) nada acontece!!!

18 Respostas

M
public void removeRow(int row) {
		getLinhas().remove(row);
		fireTableRowsDeleted(row,row);
	}

	public void limpaTabela() {
		int size = getRowCount();
		getLinhas().clear();
                                fireTableRowsDeleted(0,size);
	}
F

Obrigado pela ajuda Mark_Ameba, tbm já havia tido esta idéia e por algum motivo nada acontece…

S

Olá fernando.zambone

private void atualizaTabelaPatrimonio() throws Exception {
   tabela.jTable1.removeAll();
   stmt = dbConnection.createStatement();
   query = "select id,item, tombamento, descricao, data, setor from patrimonio order by item";
   rs = stmt.executeQuery(query);
   tabela.preencheTabela(true,rs,colunasTabela, tamanhoColunas, posicaoTabela,nomeDosCampos);
   tabela.jTable1.getColumnModel().getColumn(0).setMinWidth(0);
   tabela.jTable1.getColumnModel().getColumn(0).setMaxWidth(0);
   stmt.close();

}

tenta isso, espero que ajude.

Silvio Guedes

F

silviogs

Obrigado pela ajuda, mas não entendi?? Este exemplo não apaga os dados da JTable a não ser que o método removeAll() que vc invocou faça isto…

M
public void limpaTabela() {
		getLinhas().clear();
 		fireTableDataChanged();
	}
F

Mark, muito obrigado mais uma vez. Mas novamente nada acontece, o modelo apenas continua adicionando linha quando faço uma nova procura… Estive pensando e acho que vou precisar criar uma nova instância do TableModel e atualizar a jtable para utilizar o novo modelo.

S

Olá amigo

“eu preciso que a JTable seja zerada”

basta apenas isso, o exemplo mostra como apagar toda tabela:

tabela.jTable1.removeAll();

e em seguida populá-la novamente.

stmt = dbConnection.createStatement();   
   query = "select id,item, tombamento, descricao, data, setor from patrimonio order by item";   
   rs = stmt.executeQuery(query);   
   tabela.preencheTabela(true,rs,colunasTabela, tamanhoColunas, posicaoTabela,nomeDosCampos);   
   tabela.jTable1.getColumnModel().getColumn(0).setMinWidth(0);   
   tabela.jTable1.getColumnModel().getColumn(0).setMaxWidth(0);   
   stmt.close();

neste caso:
tabela.preencheTabela(true,rs,colunasTabela, tamanhoColunas, posicaoTabela,nomeDosCampos);

criei uma classe para criar a tabela vazia, e também populá-la.

Silvio Guedes

M

Poste seu TableModel para vermos o que esta acontecendo.

F

Mark, segue:

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

public class SimpleTableModel extends AbstractTableModel {

	private ArrayList linhas = null;
	private String[] colunas = null;
	public String[] getColunas() {return colunas;}
	public ArrayList getLinhas() {return linhas;}
	public void setColunas(String[] strings) {colunas = strings;}
	public void setLinhas(ArrayList list) {linhas = list;}

	public int getRowCount() {return getLinhas().size();}
	public int getColumnCount() {return getColunas().length;}
	
	public Object getValueAt(int rowIndex, int columnIndex) {
		String[] linha = (String[])getLinhas().get(rowIndex);
		return linha[columnIndex];
	}
	
	public SimpleTableModel(ArrayList dados, String[] colunas, boolean[] edicao) {
		setLinhas(dados);
		setColunas(colunas);
		colsEdicao = edicao;
	}
	
	private boolean[] colsEdicao;
	public boolean isCellEditable(int row, int col) {
		return colsEdicao[col];
	}
	
	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 String getColumnName(int col) {
		return getColunas()[col];
	}
	
	public void removeRow(int row) {
		getLinhas().remove(row);
		fireTableRowsDeleted(row,row);
	}
	
	public void limpaTabela() {
		getLinhas().clear();
		fireTableDataChanged();
	}
}
M

Deveria funcionar.

Voce tem certeza que esse método está sendo chamado?

F

Mark, coloquei um System.out.println de teste e funcionou, está sim sendo chamado, o getLinhas().clear() está limpando os dados normalmente (tmb ja testei) mas por algum motivo a tabela não está se atualizando com os novos dados…

V

Isso ta dentro de um JScrollPane??

Se sim… tenta isso…

jScrollPane2.setViewportView(jTable1);
I

Posta todo o código da sua classe que tá usando o Model.

F

Ironlynx o código ta um poco (ou muito) bagunçado pq eu ja tava ficando doido com esse problema da jtable e comecei a fazer um monte de testes que bagunçou o código, mas aí vai:

import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.sql.*;

public class CadProd extends JFrame implements ActionListener {
	
	JButton btNovo = new JButton("Novo");
	JButton btProcurar = new JButton("Procurar");
	JTextField tfPN = new JTextField(12);
	
	
	ArrayList dados = new ArrayList();
	ArrayList<String> componentes = new ArrayList<String>();
	String[] colunas = new String[] {"Part Number", "Descrição", "Quantidade", "Unidade", "Fator Refugo"};
	boolean[] edicao = {true, false, false, false, false};
	SimpleTableModel modelo = new SimpleTableModel(dados, colunas, edicao);
	JTable tabela = new JTable(modelo);
	
	public static void main(String[] args) {
		CadProd gui = new CadProd();
		gui.go();
		
	}
	
	public void go() {
		
		btProcurar.addActionListener(this);
		btNovo.addActionListener(this);
		tfPN.addActionListener(this);
		JFrame janela = new JFrame("Cadastro de Produtos");
		janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		janela.setSize(new Dimension(500,550));
		janela.setLocationRelativeTo(null);
		JPanel painel = new JPanel();
		painel.setPreferredSize(new Dimension(200,200));
		if (!BD.getConnection()) {
			JOptionPane.showMessageDialog(null,"Falha na conexão com o Banco de Dados!");
			System.exit(0);
		}
		JScrollPane scroller = new JScrollPane(tabela);
		janela.getContentPane().add(painel);
		painel.add(tfPN);
		painel.add(btProcurar);
		painel.add(scroller);
		painel.add(btNovo);
		janela.setVisible(true);

	}
	
	public void listaTabela(String pn) {
		try {
			BD.setResultSet("SELECT * FROM rel_prodcomp WHERE PNMaster = '" + pn + "'");
			while(BD.resultSet.next()) {
				componentes.add(BD.resultSet.getString("PNComp"));
			}
			int i=0;
			
				
				while (i < componentes.size()) {
					BD.setResultSet("SELECT * FROM Produtos WHERE partnumber = '" + componentes.get(i) + "'");
					BD.resultSet.next();
					modelo.addRow(new String[] {BD.resultSet.getString("partnumber"), BD.resultSet.getString("descricao"), BD.resultSet.getString("quantidade"), BD.resultSet.getString("un"), BD.resultSet.getString("fat_refugo")});
					i++;
					
				//}
			}
			/*do {
				String teste = BD.resultSet.getString("PNComp");
				System.out.println(teste);
				//modelo.addRow(new String[] {)
			} while(BD.resultSet.next());*/
		} catch(SQLException erro) {
			erro.printStackTrace();
		}
		
		/*try {
			BD.setResultSet("SELECT partnumber, descricao, quantidade, un, fat_refugo FROM Produtos WHERE partnumber ='" + pn + "'");
			BD.resultSet.next();
			do {			
				modelo.addRow(new String[] {BD.resultSet.getString("partnumber"),BD.resultSet.getString("descricao"),BD.resultSet.getString("quantidade"),BD.resultSet.getString("un"),BD.resultSet.getString("fat_refugo")});
			} while(BD.resultSet.next());
		} catch (SQLException erro) {
			JOptionPane.showMessageDialog(null, "Falha na seleção de dados!");
			erro.printStackTrace();
		}*/
	}
	
	public boolean procuraPN(String pn) {
		boolean existePn = true;
		BD.setResultSet("SELECT count(*) FROM Produtos WHERE partnumber = '" + pn + "'");
		try {
			BD.resultSet.next();
			if(BD.resultSet.getRow() == 0) {
				existePn = false;
			}
		} catch(SQLException erro) {
			erro.printStackTrace();
		}
		return existePn;
	}
	
	public void limpaTabela() {
		dados.clear();
		//modelo = new SimpleTableModel(dados, colunas, edicao);
		//tabela.updateUI();
	}
	
	public void actionPerformed(ActionEvent evt) {
		if(evt.getSource() == btNovo) {
			if(modelo.getRowCount() == componentes.size()) {
				modelo.addRow(new String[] {"","","","",""});
			}
		}		
		if(evt.getSource() == btProcurar || evt.getSource() == tfPN) {
			limpaTabela();
			dados.clear();
			boolean existePN = procuraPN(tfPN.getText());
			if(existePN == false)
				JOptionPane.showMessageDialog(null, "Produto não encontrado!", "ERRO!", JOptionPane.ERROR_MESSAGE);
			else
				listaTabela(tfPN.getText());
		}
			
	}

}
M

Voce nesse método apenas limpa sua ArrayList antiga

public void limpaTabela() {   
        dados.clear();   
        //modelo = new SimpleTableModel(dados, colunas, edicao);   
        //tabela.updateUI();   
    }

Por que não chama o método do modelo mesmo?

public void limpaTabela() {   
        modelo.limpaTabela();   
    }
T

Tenho exactamente o mesmo problema! já não sei que fazer para resolver!

M

Como está seu TableModel?

T

Problema Resolvido! Após uma análise vi que era a maquina virtual que não estava a compilar bem, pois em debug o trace não estava correcto! Reinstalei o jdk 6u23 e ficou bom!

Obrigado pela ajuda!

Criado 28 de setembro de 2009
Ultima resposta 2 de mar. de 2011
Respostas 18
Participantes 6