Dificuldades no aprendizado do DefaultTableModel-[resolvido]

ora viva pessoal!
tenho problemas em relação a ao uso de um defaulttablemodel já vi alguns artigos sobre o assunto aqui mesmo do guj mas não gostaria apenas de copiar “decorar” o codigo dos outros pois estou a trabalhar em um projectinho de control de estoque e tenho um JInternalFrame que eu gostaria que aparece - se nele uma tabela com o [color=darkred]nome[/color] e [color=darkred]quantidade[/color][color=#444444] [/color] dos produtos ja registados.

desde ja agradeço.

para esse caso tenho uma classe RegistoUI, ProdutoAbstractTableModel e por fim ProdutoJTable.

public class RegistoUI extends JInternalFrame{
  private ProdutoJTable tabela = null;
 //outros atributos
     . 
     .
 private ProdutoJTable getTabela(){
  if(tabela == null){
   tabela = new ProdutoJTable();
  }
  return tabela;
 }
 // depois é adicionado a um JScrollPane.
}

com base no que ja li nos artigos e duvidas aqui no guj a classe ProdutoAbstractTableModel ficou assim

import javax.swing.table.AbstractTableModel;
import java.util.ArrayList;

public class ProdutoTableModel extends AbstractTableModel {
       //tentei usar o conceito do poste do Felipe Saab.
	private static final int COL_NOME = 0;
	private static final int COL_QUANTIDADE = 1;

	private ArrayList<Produto> lista;
	
	public ProdutoTableModel() {
		lista = new ArrayList<Produto>();
	}
	
	public ProdutoTableModel(ArrayList<Produto> list){
		this();
		lista.addAll(list);
	}

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

	public int getColumnCount(){
		return 2;
	}

	public String getColumnName(int column){
		
		if(column == COL_NOME)

			return "Nome";

		else if(column == COL_QUANTIDADE)

			return "Quantidade";

		return null;
	}

	public Class getColumnClass(int columnIndex){
		//retorna a class que representa a coluna
		if(columnIndex == COL_NOME)
			
			return String.class;
		
		else if(columnIndex == COL_QUANTIDADE)

			return Integer.class;

		return  String.class;

	}

  public Object getValueAt(int rowIndex, int columnIndex){
		//pega o produto da lista
		Produto produto = lista.get(rowIndex);

		if(columnIndex == COL_NOME){
			return produto.getNome();
		}else if(columnIndex == COL_QUANTIDADE){
				return produto.getQuantidade();
		}
		return null;
	}

	public void setValueAt(Object aValue, int rowIndex, int columnIndex){

		Produto produto = lista.get(rowIndex);

		if(columnIndex == COL_NOME){

			produto.setNome(aValue.toString());		

		}else if(columnIndex == COL_QUANTIDADE){

				produto.setQuantidade(Long.parseLong(aValue.toString()));
		}

		fireTableDataChanged();
	}

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

a outra é:

import javax.swing.JTable;

public class ProdutoJTable extends JTable{

	private Registo registo = null;
	private ProdutoTableModel myModel = null;

	public ProdutoJTable(){
		registo = new Registo();// classe que contém um arraylist de produtos
		myModel = new ProdutoTableModel(registo.lista);
		this.setModel(myModel);
		this.setToolTipText("eu sou uma table");
	}

}

Não entendi direito sua dúvida, você está com dúvida de como implementar esse TableModel no seu projeto ou em alguns métodos e funcionalidades do TableModel?

para ser sincero eu to com dúvida na implementação e ainda não entendi direito de como funciona o AbstractTableModel.

Vou tentar explicar um geral sobre o Table Model, não sou um expert nisso, mas acho que vais conseguir entender:

O table model ™ é basicamente o gerenciador da sua tabela, se você não cria o seu próprio, terá que usar o DefaultTableModel, que já vem pronto, só que é ruim de trabalhar, você não irá conseguir fazer umas tarefas que com um modelo personalisado daria.

Tu cria um classe extendendo a classe AbstractTableModel, que tem vários métodos para gerenciamento de tabelas, só é preciso sobrescrever esses métodos.

O construtor do seu TM pode ser criado da forma que você bem entender, podes criar ele com uma lista previamente preenchida, recebendo-a como parâmetro, iniciar uma tabela vazia, ou o que você precisar que seja feito.

No seu caso, a sua tabela poderia ter uns métodos a mais, pra ajudar, como por exemplo esses:

[code]public void setValueAt(Object aValue, int rowIndex) {
Registro reg = (Registro) lista.get(rowIndex); // Carrega o item da linha que deve ser modificado

    reg.setNome(aValue.getNome());
    reg.setLocal(aValue.getQuantidade());
    fireTableCellUpdated(rowIndex, 0);
    fireTableCellUpdated(rowIndex, 1);
}//esse método seta um valor pra determinada linha e o TM irá atualizar a célula da linha e coluna indicadas, nesse caso irá atualizar toda a linha[/code]

public void addRegistro(Registro reg) { lista.add(m); int ultimoIndice = getRowCount() - 1; fireTableRowsInserted(ultimoIndice, ultimoIndice); }//esse método adiciona um novo registro ao final da tabela

public void removeRegistro(int indiceLinha) { lista.remove(indiceLinha); fireTableRowsDeleted(indiceLinha, indiceLinha); }//remove um registro e atualiza a tabela, você pode fazer um botão que pega a linha selecionada na tabela e chama esse método

public void limpar() { lista.clear(); fireTableDataChanged(); }//limpa toda a tabela e atualiza ela
Esses são só alguns métodos que você poderia utilizar, depende das necessidades na sua aplicação…
Sugiro você a criar um vetor de Strings com o nome das colunas, por exemplo assim:

private String[] colunas = new String[]{ "Nome", "Quantidade"};
Ai ficaria mais fácil pra pegar por exemplo o nome da coluna:

public String getColumnName(int columnIndex) { return colunas[columnIndex]; }

Para implementar, podes fazer assim:

JTable tabela = new JTable();//crio uma tabela ProdutoTableModel meuModel = new ProdutoTableModel();//crio o seu table model tabela.setModel(meuModel);//seto para a tabela, qual será o table model para ela usar meuModel.addRegistro(new Registro("reg1", 10));//estou adicionando um registro na tabela, ela irá atualizar com esse novo registro //Obs.: eu não sei como é o construtor do seu registro, estou só supondo que seja assim

Tudo o que você quiser fazer com a tabela, você irá fazer no table model, então é só criar os métodos que você precisar, e ficará muito fácil manipular essa tabela.

Não sei se fico muito claro, mas eu tentei :lol:

muito esclarecedor esse post, obrigado até a próxima :smiley: