Auxílio na criação da minha propia Jtable e JtableModel

4 respostas
pauloricardobraga

Boa noite pessoal,

estou fazendo uma aplicação e reparei que a mesma perde performance no momento de atualizar a JTable.
como estou fazendo em tempo de execução a única forma que encontrei (como sou iniciante) foi remover todas as linhas da Jtable e adicionar todas as linhas novamente.
Segue abaixo método para atualizar a tabela:

// ao final de cada operação chamo esse método. perdendo assim performance.
private void atualizaTabela(String pesquisa) {
        tbRamais.updateUI();
        model = (DefaultTableModel) tbRamais.getModel();
        model.getDataVector().clear();
        try {
            rVet = controleRamal.obterRamalPesquisa(pesquisa);
            for (int i = 0; i < rVet.length; i++) {
                Ramal r = rVet[i];
                if (r != null) {
                    Diretoria diretoria = controleDiretoria.obterDiretoriaPeloCod(r.getCodigoDiretoria());
                    Gerencia gerencia = controleGerencia.obterGerenciaPeloCod(r.getCodigoGerencia());
                    NRamal nRamal = controleNRamal.obterNRamalPeloCod(r.getRamal());
                    Object linha[] = {
                        r.getNome(),
                        nRamal.getNRamal(),
                        diretoria.getNome(),
                        gerencia.getNome()
                    };
                    model.addRow(linha);
                }
            }

Amigos, notei em outros tópicos que não é recomendado utilizar DefaultTableModel, então, estou querendo criar meu propio defaultTableModel estendendo de um abstractTableModel.
Mas não sei como começar, tenho que criar meu propio Jtable tambem? sobrescrevendo o método setModel?
como crio esse DefaultTableModel? que métodos devo utilizar para fazer com que minha tabela atualize em tempo de execução?

4 Respostas

rotteny

Opá, rapaz, to na mesma sua, tentando criar meu primeiro TableModel, tenho tido algumas dificuldades, mas o passo inicial é esse mesmo, extenda a classe AbstractTableModel, crie o construtor alimentando a lista de objetos “List” e implementando as funções da abstract, alem das suas próprias.
Até agora não consegui fazer a minha model funcionar, mas continuo na luta. se descobrir algo, me fala o q vc fez, pq farei o mesmo se conseguir botar pra funcionar a minha aki!

Quanto a necessidade de implementar a JTable, acho q vc não vai precisar, pois toda a manipulação das linhas da tabela é feita pela model. sempre q vc setar a model na tabela ela monta as linhas

public class ClienteTableModel extends AbstractTableModel{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private List<Cliente> linhas;
	private String[] colunas = new String[]{"ID","Nome","RG","CPF","Endereço","Numero","Bairro","Telefone","Celular","Comercial","E-mail"};
        
       public ClienteTableModel(){
		this.linhas = new ArrayList<Cliente>();
		
	}
...
}

exemplo simples pra vc entender por onde começar

ViniGodoy

Você só tem que criar um filho de AbstractTableModel.
O link da minha assinatura tem diversos exemplos.

rotteny

Vini vc é o cara velho, sempre ajudando os noobinha! Se eu não conseguri fazer a minha funcionar te fala!

rotteny

Cara é um outro nivel trabalhar com TableModel, ja tinha sido chamada a minha atenção, mas agora que pequei o macete de trbalhar com ela, é muito mais fácil e organizado, vou ver se consigo explicar um pouco como faz.

Primeiro passo extender a classe AbstractTableModel
neste momento vamos logo criar as variaveis que são as linhas e colunas da nossa tabela.

public class ClienteTableModel extends AbstractTableModel{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private ArrayList<Cliente> linhas = new ArrayList<Cliente>();
	private String[] colunas;

Passo seguinte é criar o metodo Construtor da nossa TableModel

Bem, aki eu resolvi passar a coluna no contrutor por conta de uma coisinha que faço na aplicação e achei mais organzado, mas poderia ter passado o valor na declaração da ariavel "colunas"

public ClienteTableModel(){
		this.colunas = new String[]{"ID","Nome","RG","CPF","Endereço","Numero","Bairro","Telefone","Celular","Comercial","E-mail"};
}
O terceiro passo é implementar as classes da TableModel, sem as quais o nosso modelo não vai funcionar
@Override
	public int getColumnCount() {
		return colunas.length;
	}
	@Override
	public int getRowCount() {
		// TODO Auto-generated method stub
		return linhas.size();
	}
	
	@Override
	public Object getValueAt(int row, int column) {
		Cliente cliente = linhas.get(row); // Carrega o item da linha que deve ser modificado  
		
		switch (column) { // Seta o valor do campo respectivo  
			case 0:  	
				return cliente.getId();
			case 1:
				return cliente.getNome();
			case 2:
				return cliente.getRg();
			case 3:
				return cliente.getCpf();
			case 4:
				return cliente.getEndereco();
			case 5:
				return cliente.getNumero();
			case 6:
				return cliente.getBairro();
			case 7:
				return cliente.getTelefone();
			case 8:
				return cliente.getCelular();
			case 9:
				return cliente.getComercial();
			case 10:
				return cliente.getEmail();
			default:
				throw new IndexOutOfBoundsException("Coluna não identificada");
		}
		
	}

Agora repare nesta ultima função getValueAt, ela é muuuito importante, pois ela é responsável por povoar sua tabela, não sei se estou sendo bem claro, mas se sua tabela mostrar apenas linhas em branco, o problema pode estar aki.

E por fim crie as funções que vc achar que precisa para atender suas necessidades, eu criei as que eu precisei para manipular meus dados, o qu enão quer dizer que vc deva seguir exatamente como está, mas a primeira parte vc tem q seguir a risca!
public String getColumnName(int column){
		return colunas[column];
	}
	
	public int getIdAt(int row) {
		return linhas.get(row).getId();
	}
	
	public void removeRow(int row){
		linhas.remove(row);
	}
	
	public void addRow(Cliente cliente){
		linhas.add(cliente);
	}
	
	public Cliente getCliente(int row){
		return linhas.get(row);
	}
	
	public void setCliente(int row, Cliente cliente){
		linhas.set(row, cliente);
	}

Espero ter ajudado e contribuido com o forum que tem me ajudado tantas vezes

Abraços e sucesso pra todos

Vini sou seu fã! :D

Criado 12 de janeiro de 2011
Ultima resposta 21 de fev. de 2011
Respostas 4
Participantes 3