TableModel

8 respostas
evertonsilvagomesjav

Qual a melhor forma de chamar o TableModel para repintar minha tabela? To tentando aqui mas nao estou conseguindo. Tem algum metodo que "avisa" ao meu JTable para chamar getValueAt()? Pois nao queria instanciar toda hora um TableModel para criar novos dados para a tabela, e sim passar novos dados para um método do meu tableModel para fazer isso sem ter que instanciar novamente meu Model, porém nao to conseguindo.

DESSA FORMA NAO FUNCIONA
public void itemStateChanged(ItemEvent arg0) {
					
					if(!nomeDaPasta.equalsIgnoreCase(comboBox.getSelectedItem().toString()))
					
						nomeDaPasta = comboBox.getSelectedItem().toString();
										
						artistas = leitura.leNomeDasMusicas(nomeDaPasta);
					
						list = addArtistas(artistas, nomeDaPasta);
							
						if(modelTable == null){
						
							modelTable = new TableModel(list); 
							
							table.setModel(modelTable); 							
						}else{
							
							modelTable.addLista(list); // esse aqui é o método no meu tableModel que eu criei para "tentar repintar mais nao consegui"

						
						}
																		
						
				}
				
			});
Assim funciona porém toda hora dou um new no TableModel é o correto mesmo?
@Override
				public void itemStateChanged(ItemEvent arg0) {
					
					if(!nomeDaPasta.equalsIgnoreCase(comboBox.getSelectedItem().toString()))
					
						nomeDaPasta = comboBox.getSelectedItem().toString();
										
						artistas = leitura.leNomeDasMusicas(nomeDaPasta);
					
						list = addArtistas(artistas, nomeDaPasta);	
						
						modelTable = new TableModel(list);
							
						table.setModel(modelTable);
												
						
				}
				
			});

8 Respostas

evertonsilvagomesjav

Meu TableModel:

package com.br.models.tables;

import java.util.ArrayList;
import java.util.List;

import javax.swing.table.AbstractTableModel;

import com.br.artistas.Artista;

public class TableModel extends AbstractTableModel {

	List<Artista> listArtistas;
	
	private final int COLUNA_NOME_ARTISTA = 0;	
	private final int COLUNA_NOME_MUSICA = 1;
	private final int COLUNA_NOME_GENERO = 2;
	
	public TableModel(List<Artista> list){
		
		this.listArtistas = new ArrayList(list);
		
	}
	
	
	@Override
	public int getColumnCount() {
		// TODO Auto-generated method stub
		return 3;
	}

	@Override
	public int getRowCount() {
		// TODO Auto-generated method stub
		return this.listArtistas.size();
	}

	@Override
	public Object getValueAt(int row, int column) {

		Artista artista = this.listArtistas.get(row);
		
		if(this.COLUNA_NOME_ARTISTA == column){
			
			return artista.getNomeArtista();
			
		}

		if(this.COLUNA_NOME_MUSICA == column){
			
			return artista.getNomeMusica();
			
		}
		
		if(this.COLUNA_NOME_GENERO == column){
			
			return artista.getGenero();
			
		}
		
		
		return null;
	}
	
	@Override
	public String getColumnName(int column){
		
		if(column == this.COLUNA_NOME_ARTISTA){
			
			return "Nome";
			
		}
		
		if(column == this.COLUNA_NOME_GENERO){
			
			return "Música";
			
		}
		
		if(column == this.COLUNA_NOME_MUSICA){
			
			return "Genero";
			
		}
		
		return null;
		
	}
	
	public void addLista(List<Artista> list){
		
		this.listArtistas = list;
		
				
	}

}
Naum_Jefferson

é so colocar um:

modelTable.fireTableDataChanged();

depois do codigo:

modelTable.addLista(list);

isso fará com que a tabela mostre os novos valores, chamando o getValueAt(linha,coluna);

evertonsilvagomesjav

Naum Jefferson:
é so colocar um:

modelTable.fireTableDataChanged();

depois do codigo:

modelTable.addLista(list);

isso fará com que a tabela mostre os novos valores, chamando o getValueAt(linha,coluna);

Rapaz deu certo, essa é a melhor forma mesmo? Ou vc acha que tem outra pratica melhor?

Naum_Jefferson

Da uma olhada em:
http://www.guj.com.br/article.show.logic?id=140
principalmente esse aqui:
http://www.guj.com.br/article.show.logic?id=147
vai te ajudar, e muito!!!

Marky.Vasconcelos

E outra, voce nao deveria criar um TableModel a cada evento, deveria criar apenas um e guardar a referencia dele para modificar o conteudo.

evertonsilvagomesjav

Entao Mark essa era a ideia com o metodo addLista()…Não seria isso?

Marky.Vasconcelos

Seria sim.
Voce só devia chamar o método pra avisar a JTable de dentro do model.

public void addLista(List<Artista> list){   
           
        this.listArtistas = list;   
         fireTableDataChanged();
                   
    }
evertonsilvagomesjav
Marky.Vasconcelos:
Seria sim. Voce só devia chamar o método pra avisar a JTable de dentro do model.
public void addLista(List<Artista> list){   
           
        this.listArtistas = list;   
         fireTableDataChanged();
                   
    }

Essa ai era minha duvida :D

Criado 30 de junho de 2010
Ultima resposta 1 de jul. de 2010
Respostas 8
Participantes 3